1

我已经创建了一个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

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

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

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

相关问题