Что происходит с кэшированными изображениями SDWebImage в моем приложении при изменении файла изображения на сервере?

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

https://github.com/rs/SDWebImage/blob/master/README.md

Текущее Использование:

[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

мой вопрос в том, что происходит после кэширования изображения, а затем через пару дней этот файл изображения на сервере был обновлен новым изображением?

на данный момент мое приложение все еще отображает кэшированное изображение.

Я не вижу в любом документации по установке тайм-аута кэша или чего-то, что распознает, что размер файла изменился.

Если у кого-то есть опыт использования этой конкретной библиотеки, то любая помощь будет очень признательна.

спасибо заранее.

10 ответов


Я взглянул на исходный код. Он обрабатывает setImageWithURL способ такой:

  1. спросите кэш памяти, если изображение есть, если да вернуть изображение и не идти дальше
  2. спросите кеш диска, если изображение есть, если да, верните изображение и не идите дальше
  3. попробуйте загрузить изображение, вернуть изображение на успех, иначе Сохранить Изображение-заполнитель

нет запроса, отправленного, чтобы спросить удаленный сервер, если там является новой версией, пока на диске есть что-то старое, например, использование теги ETag протокола HTTP.

копать немного глубже время кэша установлено в статическое значение в SDImageCache.м

static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week

его нельзя изменить с помощью сеттера.

до тех пор, пока изображение в кэше действительно SDWebImage lib не будет загружать ничего нового. Через неделю он загрузит измененное изображение.


можно использовать


проблема со старением SDImageCache (который теперь имеет сеттер: maxCacheAge) заключается в том, что SDWebImage никогда ничего не делает с ним. Вам нужно вызвать cleanDisk самостоятельно в какой-то момент, чтобы очистить старые данные из кэша. Примечание: SDWebImage вызывает cleanDisk, когда приложение завершает работу, но приложения не гарантированно получить уведомление о прекращении от ОС.


    NSURL *imageUrl = nil;
    NSDate *lastUpdate = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastUpdate"];
    NSDate *currentDate = [NSDate date];

    if (lastUpdate == nil 
        || ![lastUpdate isKindOfClass:[NSDate class]] 
        || [currentDate timeIntervalSinceDate:lastUpdate] > 60 * 60 *24) {
            [[NSUserDefaults standardUserDefaults] setObject:currentDate forKey:@"lastUpdate"];
            NSString *urlString = [NSString stringWithFormat:@"http://yourdomain.com/image/image.png?%f", [currentDate timeIntervalSince1970]];
            imageUrl = [NSURL URLWithString:urlString];
    }

Если вы хотите изменить длительность кэша по умолчанию в Swift. Настраиваются в файле AppDelegate.

Вариант 3:

SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS

Вариант 4:

SDWebImageManager.shared().imageCache?.config.maxCacheAge = CACHE_TIME_IN_SECONDS

-

Я считаю, что это влияет только на изображения, которые являются кэшами после установки этого значения. IE если ваше приложение кэширует изображение с истечением кэша по умолчанию, а затем изменить его что-то еще, ваши изображения по-прежнему будет истекать только через неделю. Простое решение этого - просто очистить кэш.


ниже то, что я заметил.

  1. Если имя/ путь изображения одинаковы, SDWebImage не будет загружать его снова в течение 1 недели.

  2. независимо от имени изображения, SDWebImage будет повторно загрузить изображение через 1 неделю (с момента его загрузки).

    static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week

  3. у них есть одна база данных, где хранятся все URL-адреса изображений. Для них URL-адрес изображения похож на первичный ключ (уникальный ключ.)

поэтому в основном они делают это, если URL-адрес изменен и отсутствует в БД, загрузите его.

С моей точки зрения то, что они делают правильно. Бывший. Если вы загружаете изображение, скажем, для пользователя, имя образа должно быть изменено, и это основное. Я знаю, что некоторые разработчики предпочитают, чтобы имя изображения было одинаковым (например, userA.ПНГ всегда).


SDWebImage выполняет агрессивное кэширование по умолчанию. Но теперь они дают возможность уважать заголовки управления кэшированием HTTP и получать последнее изображение.

для этого у них есть новый метод, где в настройках вы можете передать SDWebImageRefreshCached

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/xyz/picture"]
             placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                      options:SDWebImageRefreshCached];

вы можете найти полную информацию о методе и объяснение здесь.


последние Swift 3.0 * и SDWebImage

SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)

Как я читал в SDWeb readme в git, Это могло бы помочь:

в вашем случае, вы можете использовать SDWebImageRefreshCached флаг. Это немного снизит производительность, но будет уважать заголовки управления кэшированием HTTP:

[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
                 placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
                          options:SDWebImageRefreshCached];

поток SDWebImage:

1) SDWebImage кэширует изображение, полученное с сервера

2) SDWebImage uses url-это ключ к получению изображения из кэша

3) SDWebImage проверка:

если это в состоянии чтобы получить изображение из кэша-OK

если нет (e.G url был изменен) - не удалось получить изображение из кэша

так что на самом деле, вы получите пустой ImageView (Ы) и SDWebImage необходимо извлечь изображения из сервер снова