我有一个带有全屏 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
并且占用了大部分 cpu(分配给inflate
时它们不是)self.image
UIGraphicsGetImageFromCurrentImageContext()
我假设会发生这种情况,因为在第一种情况下 UIImage 是绘图的原始输出,而在第二种情况下,它必须在每次绘制 PNG 时解压缩它。我尝试使用 JPG 而不是 PNG,得到了类似的结果。
有没有办法解决这个问题?也许让它只在第一次绘制 PNG 时解压缩它?