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

时间:2012-08-07 22:03:32

标签: iphone ios image core-data uitableview

注意:我正在使用ARC

我有一种懒惰的图像加载技术,在从网址加载图像时非常出色。但是,我在从核心数据加载图像时遇到问题。这是我正在使用的方法:

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

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方法,因此每次显示单元格时都会调用它。我在这里做错了什么,因为我的代码是从一个可以正常加载来自网址的图像的类中改编而来的。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

据我所知,你有核心数据中的图像路径,想要在UITableView中显示图像,对吗?

延迟加载部分可能应该在cellForRowAtIndexPath方法中进行。 看看这里:loading images from a background thread using blocks可以提供帮助

基本上,您应该使用NSFetchedResultsController来确定核心数据的路径。他为你做了所有的缓存等。一旦你有了路径,懒得加载图像,如上面的链接