【发布时间】: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