我有一个使用全屏tableView的应用程序,它显示了一堆小图片。这些图片从网络中获取,通过后台线程进行处理,然后使用类似以下方式保存到磁盘:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0);
// code that adds some glosses, shadows, etc
UIImage *output = UIGraphicsGetImageFromCurrentImageContext();
NSData* cacheData = UIImagePNGRepresentation(output);
[cacheData writeToFile:thumbPath atomically:YES];
dispatch_async(dispatch_get_main_queue(), ^{
self.image = output; // refreshes the cell using KVO
});
});
这段代码仅在单元格第一次显示时执行(因为此后图像已经存在于磁盘上)。在这种情况下,单元格是使用以下方式加载的:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *savedImage = [UIImage imageWithContentsOfFile:thumbPath];
if(savedImage) {
dispatch_async(dispatch_get_main_queue(), ^{
self.image = savedImage; // refreshes the cell using KVO
});
}
});
我的问题是在第一种情况下,滚动非常顺畅。但是在第二种情况下(直接从磁盘读取图像时),即使图像已加载,滚动也会非常卡顿。绘制是导致延迟的原因。使用Instruments,我看到copyImageBlockSetPNG
,png_read_now
和inflate
占用了大部分CPU(当将self.image
分配给UIGraphicsGetImageFromCurrentImageContext()
时它们不会这样)。我认为这是因为在第一种情况下,UIImage是绘图的原始输出,而在第二种情况下,它必须每次绘制时解压缩PNG。我尝试使用JPG代替PNG,结果类似。
有没有方法来解决这个问题?也许只在第一次绘制时解压PNG?
NSCache
中,以避免再次访问磁盘。 - Ryder Mackay