在tableview中延迟加载图像

时间:2012-07-17 12:58:33

标签: iphone objective-c ios

我试图以懒惰模式加载我的uitableviewcells的图像。

我试图以最简单的方式做到这一点,我看到了很多例子,但他们的目的远远超出了我的目的。

这就是我目前正在做的事情,它不起作用:

// Configure the cell...
    Info *info = [self.Array objectAtIndex:indexPath.row];
    cell.textLabel.text = info.name;
    cell.detailTextLabel.text = info.platform;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;


    //The image is downloaded in asynchronous 

    NSBlockOperation *downloadingImgBlock = [NSBlockOperation blockOperationWithBlock:^{
        NSString* imageURL = info.imgURL;
        NSData* imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:imageURL]];
        cell.imageView.image = [UIImage imageWithData:imageData];
    }];
[self.queue addOperation:downloadingImgBlock];

为什么它不起作用?它怎么会起作用?

5 个答案:

答案 0 :(得分:5)

男,AsyncImageView是你的朋友!只需设置图片网址,即可为您处理所有内容,下载,缓存。太棒了。

答案 1 :(得分:1)

请尝试以下代码

  ......
  __block UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  __block UIImage *img;
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString: imageURL]]];

        dispatch_async(dispatch_get_main_queue(),^{

            cell.imageView.image = img;

            }
        });


    });
  ......

答案 2 :(得分:1)

使用第三方库源代码是最简单的,但是这里是你如何在代码中完成它。您希望将NSMutableArray作为.h中的属性或.m的顶部属性,如下所示:

@implementation viewController{
     NSMutableArray *picList;
}

并在-initWithCoder:或者,无论你是什么初始的重载:

picList = [[NSMutableArray alloc] init]; 
<{1>}中的

(fullPicURL是网址):

– tableView:cellForRowAtIndexPath:

其中if([self imageExists:fullPicURL]){ shoePic = [picList objectForKey:fullSmallPicURL]; } else { NSURL *picURL = [NSURL URLWithString:fullPicURL]; shoePic = [UIImage imageWithData:[NSData dataWithContentsOfURL:picURL]]; NSDictionary *thisImage = [NSDictionary dictionaryWithObject:shoePic forKey:fullSmallPicURL]; [cachedImages addEntriesFromDictionary:thisImage]; } 是您编写的函数,用于检查字典的URL。对象是图片本身,关键是网址。然后你做-imageExists:,或者你想要调用它的任何东西,你就完成了缓存。要以异步方式加载它们,请执行以下操作:

cell.image = showPic;

并在fetchedData结尾处:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSData *data = [NSData dataWithContentsOfURL:shoes];
    [self performSelectorOnMainThread:@selector(fetchedShoeData:) withObject:data waitUntilDone:YES];

});

然后确保编辑[self.tableView reloadData]; 以便在必要时进行更改。可能需要做一些其他事情才能让它100%工作,让我知道

答案 3 :(得分:0)

尝试这个,我总是使用这个方案异步加载图像:

(我没有找到最简单的方法。)

- (void)inAnyMethod {

    // ...

    void (^blockLoadPhoto)() =  ^{
        UIImage *_imageTemporary = [UIImage imageNamed:@"..."];
        if (_imageTemporary) {
            [self performSelectorOnMainThread:@selector(setPhoto:) withObject:_imageTemporary waitUntilDone:true];
        }
    };

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), blockLoadPhoto);

    // ...

}

- (void)setPhoto:(UIImage *)photo {
    // do something with the loaded image
}

答案 4 :(得分:0)

我终于设法用以下方式设置图像:

– performSelectorOnMainThread:withObject:waitUntilDone:

下载图片后