1

我有一个 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?还是因为我一开始只有对图像的引用,所以图像的实现是慢的部分?

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

4

2 回答 2

3

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

  1. 创建一个CGBitmapContextRef使用UIGraphicsBeginImageContext
  2. 将图像绘制到上下文中
  3. 使用从上下文中获取新图像UIGraphicsGetImageFromCurrentImageContext
  4. 将图像传回主线程
于 2012-10-18T16:41:34.440 回答
0

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

于 2012-10-18T16:48:15.337 回答