如何在tableview中滚动时停止重新加载图像

时间:2014-06-24 07:55:36

标签: objective-c multithreading uitableview grand-central-dispatch nscache

我创建了一个UITableView,并且有一个URL数组,我需要设置它们的图像属性。我已经设法通过使用dispatch_async来检索图像来改进表的滚动功能,并将它们存储在我声明为强属性的NSCache中,但现在当我滚动表格时,我可以看到来自出现的单元格中的前一行,然后当滚动停止时,图像会更新为它们应该是什么,但有时它们也会循环浏览其他几个图像。这是我在cellForRowAtIndexPathMethod中的代码,有谁知道为什么会这样?

UIImage* image = [_imageCache objectForKey:article.imageURL];
if(image){
    [cell.imageRight setImage:image];
} else {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0ul);
dispatch_async(queue, ^{

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

dispatch_async(dispatch_get_main_queue(), ^{
    [_imageCache setObject:image forKey:article.imageURL];
    [cell.imageRight setImage:img];
    [cell setNeedsLayout];
    });
});
}

1 个答案:

答案 0 :(得分:1)

我会创建一个NSOperationQueue,而不是dispatch_async()只是将块添加到队列的末尾。

将最大并发操作数设置为1,这样一次只能下载一个图像,这样可以提供比典型3G连接更好的性能。

每个操作应该做的第一件事是检查图像是否已经在缓存中,然后如果是,则中止。这样,当相同的图像下载被添加到队列5000次时,没关系 - 因为它只会在第一次下载。