【发布时间】:2017-06-16 23:40:18
【问题描述】:
关于如何异步加载图像和其他下载的数据有很多问题,但没有关于将这些图像(一旦下载)异步加载到 UI 中的问题。
我正在尝试在 UICollectionView 上实现 60 fps 的滚动,尽管我正在寻找适用于所有视图的解决方案。
例如,如果我想将 Assets 文件夹中的图像加载到快速滚动的 UIScrollView 中,则将它们加载到内存中然后在 UI 中绘制需要一些时间。有什么方法可以先将这些图像缓存在内存中(同时不会损害内存/使用太多),然后在将它们缓存在内存中后将它们加载到单元中?
按照我现在的理解,当我说,
cell.imageView.image = UIImage(named: "grapes")
assets 文件夹grapes 被打开并从中读取,然后将相应的图像(1x、2x 或 3x)带入内存。将正确的图像带入内存后,将cell.imageView.image分配给它,然后绘制图像。这是准确的吗?所有这些都发生在主线程上吗?如果是这样,那么这不是有可能阻塞主线程并导致设备跳过一些帧吗?
我假设在解决复杂表达式或格式化文本时会发生类似的过程。如果是这样,那么我可以以及如何创建要异步加载的内容,以便主线程不会被阻塞(即使以暂时空的内容视图为代价)?
【问题讨论】:
-
@Rob,“图像的尺寸不适合 UI”,您的意思是 UIImageView 需要执行更多操作以进行缩放或其他操作吗?
-
我说的是图像视图,例如 40x40 点,但您使用的是 1200x1200 像素的图像,并且您使用的内容模式为
.scaleAspectFit或.scaleAspectFill。真的是任何你依赖contentMode来适当缩放图像的情况。或者,显然,如果您正在调用自己的缩放/裁剪例程。
标签: ios swift asynchronous