Хранить образ с NSCache из Firebase - Цель C - PullRequest
0 голосов
/ 26 октября 2018

Привет всем, я пытаюсь использовать 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;
}

1 Ответ

0 голосов
/ 27 октября 2018

Кажется, проблема в том, что вы создаете новый экземпляр NSCache в своем методе loadImageUsingCacheWithURLString:. Когда ячейка используется повторно и выбирается новое изображение, которое не кэшируется, вы создаете новый NSCache, который будет сохранять только последнее загруженное изображение. Не могли бы вы попробовать создать экземпляр кэша только в инициализаторе ячейки и посмотреть, работает ли он? Или, возможно, рассмотрите возможность использования кэша, который не является свойством ячейки, чтобы избежать загрузки одного и того же изображения в 2 разные ячейки.

...