使用来自 Firebase 的 NSCache 存储图像 - Objective C
Store Image with NSCache from Firebase - Objective C
大家好,我正在尝试使用 NSCache 来管理通过 URL 从 Firebase 获取的图像。我的用户 imageView 不断补偿,所以我想使用 NSCache 来想象图像只加载一次并存储在缓存中......所有这些都不起作用但是我的图像每次浏览 table 视图时都会不断充电.
谁能解释一下我哪里错了?非常感谢您能给我的任何答案...
我的项目在Objective C
这是我在自定义 Cell 中的代码
@interface UserListMessageCell ()
@property (nonatomic, strong) NSURLSessionTask *task;
@property (nonatomic, strong) NSCache *imageCache;
@end
@implementation UserListMessageCell
-(void)loadImageUsingCacheWithURLString:(NSString *)urlString {
UIImage *cachedImage = [_imageCache objectForKey:urlString];
if (cachedImage) {
_userPhoto.image = cachedImage;
return;
}
_imageCache = NSCache.new
NSURL *url = [NSURL URLWithString:urlString];
[[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *image = [UIImage imageWithData:data];
if (image) {
self.imageCache = NSCache.new;
[self.imageCache setObject:image forKey:urlString];
self.userPhoto.image = image;
}
else self.userPhoto.image = [UIImage imageNamed:@"user"];
});
}] resume];
}
@end
这是我在 TableView 中的实现
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UserListMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
UserReference *userRef = _isFiltered ? self.filteredUser[indexPath.row] : self.userArray[indexPath.row];
cell.userNameLabel.text = userRef.name;
cell.userUniversityLabel.text = userRef.university;
[cell loadImageUsingCacheWithURLString:userRef.urlPhoto];
return cell;
}
问题似乎是您在 loadImageUsingCacheWithURLString:
方法中创建了 NSCache
的新实例。当单元格被重复使用并获取未缓存的新图像时,您正在创建一个新的 NSCache
,它将仅保留最后加载的图像。您能否尝试仅在单元的初始化程序中实例化缓存,看看是否可行?或者可以考虑使用不是单元格 属性 的缓存,以避免在 2 个不同的单元格中加载相同的图像。
大家好,我正在尝试使用 NSCache 来管理通过 URL 从 Firebase 获取的图像。我的用户 imageView 不断补偿,所以我想使用 NSCache 来想象图像只加载一次并存储在缓存中......所有这些都不起作用但是我的图像每次浏览 table 视图时都会不断充电.
谁能解释一下我哪里错了?非常感谢您能给我的任何答案...
我的项目在Objective C
这是我在自定义 Cell 中的代码
@interface UserListMessageCell ()
@property (nonatomic, strong) NSURLSessionTask *task;
@property (nonatomic, strong) NSCache *imageCache;
@end
@implementation UserListMessageCell
-(void)loadImageUsingCacheWithURLString:(NSString *)urlString {
UIImage *cachedImage = [_imageCache objectForKey:urlString];
if (cachedImage) {
_userPhoto.image = cachedImage;
return;
}
_imageCache = NSCache.new
NSURL *url = [NSURL URLWithString:urlString];
[[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *image = [UIImage imageWithData:data];
if (image) {
self.imageCache = NSCache.new;
[self.imageCache setObject:image forKey:urlString];
self.userPhoto.image = image;
}
else self.userPhoto.image = [UIImage imageNamed:@"user"];
});
}] resume];
}
@end
这是我在 TableView 中的实现
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UserListMessageCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
UserReference *userRef = _isFiltered ? self.filteredUser[indexPath.row] : self.userArray[indexPath.row];
cell.userNameLabel.text = userRef.name;
cell.userUniversityLabel.text = userRef.university;
[cell loadImageUsingCacheWithURLString:userRef.urlPhoto];
return cell;
}
问题似乎是您在 loadImageUsingCacheWithURLString:
方法中创建了 NSCache
的新实例。当单元格被重复使用并获取未缓存的新图像时,您正在创建一个新的 NSCache
,它将仅保留最后加载的图像。您能否尝试仅在单元的初始化程序中实例化缓存,看看是否可行?或者可以考虑使用不是单元格 属性 的缓存,以避免在 2 个不同的单元格中加载相同的图像。