caching图像和UICollectionView

我对Objective-C很新,所以希望这一切都合情合理。 我已经从服务器下载图像,并在collectionView cellForItemAtIndexPath:方法的图像视图中显示它们。 我面临的问题是图像看起来不是caching。 看起来每次单元格被重新使用时,服务器的相关图像将被重新下载。

在我的viewDidLoad方法我创build一个NSMutableDictionary:

 imageDictionary = [[NSMutableDictionary alloc]initWithCapacity:50.0]; 

从阅读文档,看类似问题的答案,我认为这一点,加上下面的代码就足够了。 我已经在这一两天了,我知道有一些我失踪或一个概念,我不抓住。

 #pragma mark - UICollectionView Data Source - (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section;{ NSLog(@"Begin retrieving photos"); return [self.photos count]; } -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ return 1; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;{ CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath]; cell.imageView.image = nil; if (cell.imageView.image == nil) { dispatch_queue_t downloadQueue = dispatch_queue_create("image downloader", NULL); dispatch_async(downloadQueue, ^{ NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.photos objectAtIndex:indexPath.row] objectForKey:@"fullimage"]]]; UIImage *image = [UIImage imageWithData:data]; [imageDictionary setObject:image forKey:@"Image"]; dispatch_async(dispatch_get_main_queue(), ^{ cell.imageView.image = [imageDictionary objectForKey:@"Image"]; [cell setNeedsDisplay]; }); }); } return cell; } 

任何帮助将不胜感激。 提前致谢。

@yuf – 再次感谢您的方向。 NSCache似乎正在让我以前的结果。 这是正常工作的代码。 如果有人有类似的问题,你可以比较以下我的原始问题。

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;{ CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath]; NSString *imageName = [[self.photos objectAtIndex:indexPath.row] objectForKey:@"fullimage"]; UIImage *image = [imageCache objectForKey:imageName]; if(image){ cell.imageView.image = image; } else{ cell.imageView.image = nil; dispatch_queue_t downloadQueue = dispatch_queue_create("image downloader", NULL); dispatch_async(downloadQueue, ^{ NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.photos objectAtIndex:indexPath.row] objectForKey:@"fullimage"]]]; UIImage *image = [UIImage imageWithData:data]; dispatch_async(dispatch_get_main_queue(), ^{ cell.imageView.image = image; }); [imageCache setObject:image forKey:imageName]; }); } return cell; }