异步加载大型UIImages

时间:2012-10-18 16:33:39

标签: ios objective-c asynchronous uiimage grand-central-dispatch

我有一个NSManagedObject,其中包含存储在/var/mobile/Applications/.../.../uniqueIDforNSMO/Pictures/

之类的图片

通过基于NSMO的uniqueID找到这些图片,我没有问题,我有一个DataController,它将为我提取它,这是非常高效的。但是当我尝试将这些图片添加到视图时,我遇到了问题,UI被阻止了。我怀疑问题是这些图像的分辨率非常高(它们是来自iPad相机胶卷的图像)。

显示5张图片大约需要3秒钟,因此会阻止用户界面。即使只显示2个图像也会阻止该死的UI。以下是我在后台线程中添加它们的方法:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    UIImage *image = [self.photos objectAtIndex:index];
    dispatch_async(dispatch_get_main_queue(), ^{
        cell.imageView.image = image;
    });
});

如果我在没有调度的情况下设置imageView.image,则需要更长的时间。

问题可能是图像太大了,而单元格的imageView只有150x150吗?或者是因为我最初只对图像有一个参考,所以图像的实现是缓慢的部分?

有人可以在这里提出任何建议吗?我已尝试在将图像返回到阵列之前调整图像大小并且没有帮助。

2 个答案:

答案 0 :(得分:3)

问题是图像被延迟加载 - UIImage仅在需要绘制时将图像加载到内存中。你可以做的是急切地将图像加载到后台线程上:

  1. 使用CGBitmapContextRef
  2. 创建UIGraphicsBeginImageContext
  3. 将图像绘制到上下文中
  4. 使用UIGraphicsGetImageFromCurrentImageContext
  5. 从上下文中获取新图片
  6. 将图像传回主线程

答案 1 :(得分:0)

由于它们是高分辨率图像,我建议你应该为此持久化缩略图缓存。每次生成缩略图会不必要地浪费太多的CPU时间。