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

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

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

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

В моем классе Show есть imageURL, и вот как ячейка show использует 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

person lukaszb    schedule 07.10.2012    source источник


Ответы (2)


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

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

Обновление:

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

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

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

#import "SDImageCache.h"

@interface SDImageCache (PrivateMethods)

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

@end
person mkll    schedule 29.03.2014
comment
Отличный ответ! Благодарность! Мне также нужно было использовать эти две функции, как показано ниже, чтобы получить URL-адрес моего файла: SDImageCache *imageCache = [SDImageCache sharedImageCache]; NSArray *arrayOfPathComponents = [NSArray arrayWithObjects: [imageCache defaultCachePathForKey:imageUrlString],[imageCache cachedFileNameForKey:imageUrlString],nil]; NSString* path = [NSString pathWithComponents: arrayOfPathComponents]; NSURL *urlOfTheLocalFile = [NSURL fileURLWithPath: path]; - person drpawelo; 28.05.2015
comment
Не уверен, но, насколько я помню, в современных версиях SDWebImage эти методы уже общедоступны. Просто не проверял это. В любом случае, рад, что это помогает. - person mkll; 29.05.2015
comment
В чем ключ? Полный адрес?? - person Jonny; 19.04.2017
comment
@Jonny Да, полный http-адрес изображения. - person mkll; 19.04.2017
comment
На самом деле текущая версия SDImageCache имеет общедоступный метод cachePathForKey(), который дает вам полный путь к файлу изображения с этим ключом. - person Borzh; 13.07.2021