gpt4 book ai didi

ios - NSCache-不总是被清理?

转载 作者:行者123 更新时间:2023-11-29 12:37:21 25 4
gpt4 key购买 nike

我有 NSCache,我在其中加载和加载要在 Collection View 中显示的图像。当我必须将数据重新加载到 Collection View 时,我必须清理缓存,否则 Collection View 会在其中找到旧数据并重新加载它而不是新数据。

所以在我重新加载集合之前,我清理了我的缓存:

[self.myCache removeAllObjects];

这有时不起作用,我仍然在收藏 View 中看到旧图像。有没有另一种方法可以遍历它的值并清理它们?为什么没有被清除?

以下是我如何加载和获取图像:

-(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;

最佳答案

问题来自 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;
}

关于ios - NSCache-不总是被清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25958474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com