【问题标题】:Load large UIImages asynchronously异步加载大型 UIImages
【发布时间】:2012-10-18 16:33:39
【问题描述】:

我有一个 NSManagedObject,它的图片存储在 /var/mobile/Applications/.../.../uniqueIDforNSMO/Pictures/ 之类的地方

通过根据 NSMO 的 uniqueID 找到这些图片,我可以毫无问题地从磁盘中取出这些图片,我有一个 DataController 可以为我提取这些图片,这非常高效。但是当我尝试将这些图片添加到视图时遇到问题,UI 被阻止。我怀疑问题在于这些图像的分辨率非常高(它们是来自 iPad 相机胶卷的图像)。

显示 5 张图片大约需要 3 秒,从而使 UI 处于阻塞状态。即使只显示 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 而不调度它需要更长的时间。

问题可能是图像太大,而单元格的 imageViews 只有 150x150?还是因为我一开始只有对图片的引用,所以图片的实现是比较慢的部分?

有人可以在这里提出任何建议吗?我尝试在图像返回数组之前调整图像大小,但没有帮助。

【问题讨论】:

  • 您是否尝试过在磁盘上存储调整大小的 150x150 缩略图并加载它而不是整个图像并缩小它?
  • 我最终将需要全分辨率图像,因为他们将能够点击单元格查看完整图像,但我认为你有一个好点,我可以存储两者但只显示全分辨率图像按需提供。
  • 运行没有好处 - objectAtIndex: 在全局队列中。如果您怀疑图像文件的大小,将这些文件加载​​到 self.photos 中(我猜是 NSArray?)将需要一段时间:I/O + JPEG 解码。这也是在 cellForRowAtIndexPath: 中完成的吗?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    由于它们是高分辨率图像,我建议您为此制作持久缩略图缓存。每次都实时生成缩略图会不必要地浪费过多的 CPU 时间。

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      相关资源
      最近更新 更多