NSCache - 并不总是清理?

时间:2014-09-21 10:57:36

标签: ios objective-c

我有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;

1 个答案:

答案 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;
}