我创建了一个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];
});
});
}
答案 0 :(得分:1)
我会创建一个NSOperationQueue,而不是dispatch_async()只是将块添加到队列的末尾。
将最大并发操作数设置为1,这样一次只能下载一个图像,这样可以提供比典型3G连接更好的性能。
每个操作应该做的第一件事是检查图像是否已经在缓存中,然后如果是,则中止。这样,当相同的图像下载被添加到队列5000次时,没关系 - 因为它只会在第一次下载。