我正在構建一個應用程序,其中包含許多要在集合視圖中顯示的大圖像文件。由於圖像的大小,我發現從它們的URL創建縮略圖要快得多,並且使用圖像緩存。當我第一次在使用GCD的cellForItemAtIndexPath中實現這個功能時,我發現UI滯後減少很多,但我也注意到當收集視圖進入視圖並滾動時,單元格中的圖像會閃爍並迅速改變。我發現了一些關於類似問題的其他帖子,他們說,檢查單元格是否先是零應該解決問題,但不幸的是,這似乎造成另一個問題,其中許多圖像從未加載過。有誰知道如何解決這一問題?iOS - 修復cellForItemAtIndexPath圖像加載問題
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
PhotoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
ObjectWithPhoto *object = self.objects[indexPath.item];
cell.imageView.image = nil;
NSString *imageName = object.imageName;
NSString *imageKey = [NSString stringWithFormat:@"%@_thumbnail", imageName];
if ([[ImageCache sharedCache] imageForKey:imageKey]) {
cell.imageView.image = [[ImageCache sharedCache] imageForKey:imageKey];
} else {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSURL *imageURL = [[NSBundle mainBundle] URLForResource:imageName withExtension:@"jpg"];
CGSize imageSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.width);
UIImage *thumbnail = [UIImage createThumbnailFromURL:imageURL imageSize:imageSize];
[[ImageCache sharedCache] setImage:thumbnail forKey:imageKey];
dispatch_async(dispatch_get_main_queue(), ^(void) {
PhotoCell *cellToUpdate = (id)[collectionView cellForItemAtIndexPath:indexPath];
if (cellToUpdate) {
cellToUpdate.imageView.image = thumbnail;
} else {
NSLog(@"cell is no long visible");
}
});
});
}
return cell;
}
如果你看我的原始代碼,你會注意到,我確實將圖像設置爲零首先。你的解決方案的其餘部分是偉大的,謝謝! – Grambo