cache - Как получить путь к файловой системе для кэширования изображений с помощью SDWebImage(iOS)




swift kingfisher download image (2)

Существуют частные методы SDImageCache для получения пути файловой системы к кэшированному изображению. Мы можем сделать эти методы общедоступными с категорией. Просто SDImageCache+Private.h код ниже, скажем, SDImageCache+Private.h и добавьте его в свой проект:

#import "SDImageCache.h"

@interface SDImageCache (PrivateMethods)

- (NSString *)defaultCachePathForKey:(NSString *)key;
- (NSString *)cachedFileNameForKey:(NSString *)key;

@end

Я использую SDWebImage для кэширования изображений в UICollectionView в моем приложении iOS.

Все в порядке, однако, когда пользователь быстро прокручивается над просмотром коллекции, всегда остается небольшая пауза, прежде чем заменить место на кэшированное изображение. Я считаю, что это связано с проверками кеша. Для лучшего удобства работы я хотел бы, чтобы ячейки отображали правильное изображение вместо placeholder, как только изображение фактически кэшируется. Это было бы легко, если бы я мог получить путь к файловой системе локального (устройства) кэшированного изображения и сохранить его в экземпляре Show и использовать его (если существует) вместо моего заполнителя.

Существует возможность передать блок успеха методу setImageWithURL. Однако единственным аргументом, который он получает, является экземпляр UIImage (на самом деле в главной ветви есть также переменная BOOL, называемая кэшированием ). Итак - есть ли возможность получить путь к файловой системе изображения прямо из экземпляра UIImage ? Или мне нужно изменить SDWebImage, чтобы передать эту информацию в кешированный экземпляр? Или есть лучший способ достичь цели, которую я описал ранее?

Мой класс Show имеет imageURL, и здесь показано, как использовать show cell SDWebImage:

#import "ShowCell.h"
#import <SDWebImage/UIImageView+WebCache.h>

@implementation ShowCell

@synthesize imageView = _imageView;
@synthesize label = _label;
@synthesize show = _show;

- (void)setShow:(Show *)show
{
    if (_show != show) {
        self.label.text = show.title;
        if (show.imageURL) {
            [self.imageView setImageWithURL:[NSURL URLWithString:show.imageURL]
                           placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
        }
        _show = show;
    }
}

@end

У меня была аналогичная проблема, см.: SDWebImage, показывающий местозаполнитель для изображений в кеше

В основном я искал проект, чтобы решить эту проблему.

Обновить:

Вы можете просто сделать это, чтобы избежать мерцания (это работает с главной ветвью проекта):

[imageView setImageWithURL:url placeholderImage:imageView.image options:0 
 progress:^(NSUInteger receivedSize, long long expectedSize) {
        imageView.image = [UIImage imageNamed:@"QuestionMarkFace.png"];
 } completed:nil];