我正在尝试从网址加载图像,但由于我正在加载的图像量,它会导致我的应用程序出现严重滞后。我现在在输入 UIImage(contentsOfFile: url) 获得的图像上调用“prepareForDisplay”,我认为这解决了我的性能问题。我正在使用以下代码,但想了解原因:
class ImageLoader: ObservableObject {
uiImage.prepareForDisplay { decodedImage in
DispatchQueue.main.async {
self.image = uiImage
}
}
}
我从不使用decodedImage,但不知何故,将其设置为uiImage时,代码仍然没有显示任何滞后,这是因为当我们设置图像时,我们已经检索了该新对象吗?如果我将 imageView 设置为解码图像,我似乎会收到 [Decompressor] 错误 -17102 解压缩图像 - 可能已损坏并且没有图像出现。
根据图像类型和保存方法,图像会以各种方式压缩。 (JPEG 图像是一个明显的例子,但 PNG 也被压缩,SVG 和其他矢量图像作为矢量绘图命令发送,必须渲染为像素。)
我强烈怀疑
prepareForDisplay()
以设备的本机分辨率将图像渲染为位图,并返回完全展开的图像。几乎可以肯定,它还会缓存生成的完全展开的图像。
如果您调用
prepareForDisplay()
并忽略结果,缓存的图像可能仍然在内存中可用,因此您甚至可以快速渲染原始图像,因为系统不必再次解压缩它。但是,缓存可能会被刷新,因此如果您丢弃生成的图像,您可能会在将来的某个时刻再次长时间暂停。