Xcode:从核心数据中的图像数据延迟加载图像

Posted

技术标签:

【中文标题】Xcode:从核心数据中的图像数据延迟加载图像【英文标题】:Xcode: lazy loading images from image data in core data 【发布时间】:2012-08-07 22:03:31 【问题描述】:

注意:我正在使用 ARC

我有一种惰性图像加载技术,在从 Web url 加载图像时效果很好。但是,我在从核心数据加载图像时遇到问题。这是我正在使用的方法:

我首先分配初始化我的可变数组,从核心数据加载我的数据,然后将其存储在一个数组中。然后我有这个代码:

NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                    initWithTarget:self
                                    selector:@selector(loadImage)
                                    object:nil];
[queue addOperation:operation];

然后……

- (void)loadImage 
    for (int i = 0; i < [myArrayFromCoreData count]; i++) 
        AnObject *myObject = [myArrayFromCoreData objectAtIndex:i];
        UIImage* image;
        if ([myObject.image length] == 0) 
            image = [UIImage imageNamed:@"default.png"];
        
        else 
            image = [[UIImage alloc] initWithData:myObject.image];
        
        [self performSelectorOnMainThread:@selector(displayImage:) withObject:[NSArray arrayWithObjects:image,myObject.myObjectId, nil] waitUntilDone:NO];
    


- (void)displayImage:(NSArray*)array 
    [loadedImages setObject:[array objectAtIndex:0] forKey:[array objectAtIndex:1]];
    [self.myTable reloadData];

到目前为止,没有任何延迟,并且 NSLog 显示我的所有图像都已添加到 myObjectLoadedImages 数组中。

我遇到的问题是滚动表格视图时存在延迟,有时会导致崩溃。这是我用来显示加载图像的代码:

UIImage* image = [loadedImages objectForKey:myObject.myObjectId];
if (image != NULL) 
    myImageView.image = image;

else 
    myImageView.image = [UIImage imageNamed:@"default.png"];

这是在cellForRowAtIndexPath 方法中,因此每次显示单元格时都会调用它。我在这里做错了什么吗,因为我的代码改编自一个可以正常从 web url 加载图像的类。

【问题讨论】:

代码中似乎没有任何明显的错误。也就是说,您可以使用可变字典来存储图像,其中 objectID 作为键,图像作为数据——这将真正减少代码量,而不会改变其功能。我认为您应该发布您的整个 cellForRowAtIndexPath 并提及您是否使用 ARC。此外,仅为一张新图像重新加载整个表格确实效率低下 - 您应该找出需要更新的可见单元格,然后执行那个。 使用 NSMutableDictionary 的好建议!让它好 50%。现在一旦图像加载一次,它就很流畅了。但是第一次将图像加载到 tableviewcell 时仍然很慢 【参考方案1】:

首先想到 - 你没有缓存你的 UIImages,所以它们不是从内存中加载的。

你试过https://github.com/nicklockwood/AsyncImageView/ 吗? 在我看来,它是将异步图像加载到任何视图的最佳库,无论是从文档还是网络。它支持缓存、进度视图和许多简化控制器代码的东西。

【讨论】:

看起来很棒!知道这是否可以从核心数据而不是 plist 加载图像数据? 您是否尝试过从 CoreData 获取数据作为 NSData 并将其放入带有 AsyncImageView 的 UIImage 中?我认为这是最简单的方法。 我不知道怎么做。我试过这个AsyncImageView *imageView = (AsyncImageView *)[cell viewWithTag:4]; imageView.image = [UIImage imageWithData:myObject.image]; 但它崩溃了【参考方案2】:

据我了解,您在核心数据中有图像路径,并希望在 UITableView 中显示图像,对吗?

延迟加载部分可能应该发生在cellForRowAtIndexPath方法中。 看看这里:loading images from a background thread using blocks 这可能会有所帮助

基本上你应该使用NSFetchedResultsController来获取核心数据的路径。他为你做所有的缓存等。获得路径后,按照上面链接中的说明延迟加载图像

【讨论】:

看起来不错,我试试看。我实际上将图像数据保存在核心数据中 - 因为图像是从 URL 或相机拍摄的 - 它也必须离线运行。 好吧,您可能不想直接在 coreData(或任何 SQLite 数据库)中存储大于 -say- 图标大小的图像。您可以考虑将图像写入光盘并仅将图像的路径存储在核心数据中。这样做应该会获得更好的性能 关于 NSFetchedResultsController 的好教程:raywenderlich.com/999/…

以上是关于Xcode:从核心数据中的图像数据延迟加载图像的主要内容,如果未能解决你的问题,请参考以下文章

将图像从 Parse 加载到 UICollectionView 单元格没有延迟

具有延迟加载图像的结构化数据?

使用 SQLite 中的数据在 UIScrollView 中延迟加载

从 NSDocumentDirectory 延迟加载 UITableViewCells 的图像?

javascript 防止从延迟加载的图像中恢复内容

在 iPhone 中延迟加载图像的最佳方式是啥?