Привет всем, я пытаюсь использовать NSCache для управления изображениями, взятыми из Firebase через URL-адрес .. Я использую NSCache, потому что каждый раз, когда я просматриваю таблицу с фотографиями моих пользователей, imageView постоянно компенсируется, поэтому я хотел использоватьNSCache для представления изображений для загрузки только один раз и сохраненных в кеше ... Все это не работает, но мои изображения непрерывно перезаряжаются каждый раз, когда я просматриваю таблицу.
Может кто-нибудь объяснить, где я не прав?Большое спасибо за любой ответ, который вы можете дать мне ...
Мой проект в Objective C
Это мой код в пользовательской ячейке
@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;
}