1

注意:我正在使用 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 加载图像。

4

2 回答 2

1

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

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

于 2012-08-07T22:37:44.837 回答
0

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

延迟加载部分可能应该发生在cellForRowAtIndexPath方法中。看看这里:使用可以帮助的块从后台线程加载图像

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

于 2012-08-07T22:33:25.620 回答