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次時,這並不重要 - 因爲它只會第一次下載。

相關問題