我有NSCache
我在其中加载图像以显示在集合视图中。
当我必须将数据重新加载到集合视图时,我必须清理缓存,否则集合视图将在那里找到旧数据并重新加载它而不是新数据。
所以在我重新加载集合之前,我清理我的缓存:
[self.myCache removeAllObjects];
有时,它不起作用,我仍然在集合视图中看到旧图像。 还有另一种方法可以满足其价值并清理它们吗?为什么不被清除?
以下是我如何加载和获取图像:
-(UIImage*) imageForIndexPathRow:(NSNumber *) number
{
return [self.myCache objectForKey:[NSString stringWithFormat:@"cache:%d",[number intValue]] ];
}
-(void) setImage:(UIImage*) image forIndexPathRow:(NSNumber *) number
{
if(image)
[self.myCache setObject:image forKey:[NSString stringWithFormat:@"cache:%d",[number intValue]] ];
}
编辑: 这是我在将图像加载到单元格之前检查缓存(在另一个线程中):
UIImage *imageToSet=nil;
UIImage *cacheImg=[self imageForIndexPathRow:[NSNumber numberWithLong:cell.tag]];
if(cacheImg==nil)
{
UIImage *image=[UIImage imageWithData:data scale:1];
imageToSet=image;
//save to cache
[self setImage:image forIndexPathRow:[NSNumber numberWithLong:cell.tag]];
}
else
imageToSet=cacheImg;
答案 0 :(得分:1)
问题来自于CollectionView单元重用
您需要实施else
案例,例如
- (UIImage *)imageForIndexPathRow:(NSNumber *) number
{
UIImage *cachedImage = [self.myCache objectForKey:[NSString stringWithFormat:@"cache:%d", [number intValue]]];
if (cachedImage) {
return cachedImage;
}
// Otherwise load it from web
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://...yourImageURL"]];
UIImage *loadedImage = [UIImage imageWithData:imageData];
// Cache it back
[self.myCache setObject:loadedImage forKey:[NSString stringWithFormat:@"cache:%d", [number intValue]]];
return loadedImage;
}
并且cellForRow
应该如下所示(我的示例在UITableView上,但您可以将其移植到CollectionView)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"YourCellId"];
cell.image = nil;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *image = [self imageForIndexPathRow:@(indexPath.row)];
dispatch_async(dispatch_get_main_queue(), ^{
cell.image = image;
});
});
return cell;
}