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

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

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

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

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

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

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

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

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

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


person fulvio    schedule 19.05.2011    source источник


Ответы (9)


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

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

Не отправляется запрос на удаленный сервер, есть ли новая версия, в то время как на диске есть что-то старое, например, с помощью ETags протокола HTTP.

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

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

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

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

person Nick Weaver    schedule 24.05.2011
comment
@Fulvio Неделя в секундах: 60 секунд * 60 минут * 24 часа * 7 дней = 604800 секунд. В сутках всего 60*60*24=86400. - person Nick Weaver; 24.05.2011
comment
Означает ли это, что через неделю все активы в кеше будут загружены заново? даже если они все те же? - person zanona; 29.09.2013
comment
@zanona точно. SDWebImage не использует Etag для обнаружения изменений. - person Nick Weaver; 30.09.2013
comment
В SDWebImage 5.0+ maxCacheAge переименован в maxDiskAge. Вы можете установить максимальное время кэширования в секундах, как это. Для получения более подробной информации вы можете увидеть этот stackoverflow.com/questions/28549211/ - person Dipak; 05.04.2019

Вы можете использовать параметр options.

Быстрая версия:

imageView.sd_setImage(with: URL(string: URLWithString:profilePictureUrl),
                      placeholderImage: UIImage(named: "placeholder"),
                      options: .refreshCached,
                      completed: nil)

Версия цели-C:

[imageView sd_setImageWithURL:[NSURL URLWithString:profilePictureUrl]
             placeholderImage:[UIImage imageNamed:@"placeholder.png"]
             options:SDWebImageRefreshCached
             completed: nil];

Ваше здоровье!

person Pei    schedule 20.12.2013

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

person Mark Krenek    schedule 05.01.2013
comment
Просто предупреждение, что на самом деле это не так по состоянию на сентябрь 2014 года. Проверьте SDImageCache.m, посмотрите -(void)cleanDiskWithCompletionBlock - person Luke; 04.09.2014

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

Версия 3:

SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS

Версия 4:

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

-

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

person Krtko    schedule 10.09.2015

Ниже приведены мои наблюдения.

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

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

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

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

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

С моей точки зрения, то, что они делают, ПРАВИЛЬНО. Бывший. Если вы загружаете изображение, скажем, для пользователя A, имя изображения должно быть изменено, и это основное. Я знаю, что некоторые разработчики предпочитают, чтобы имя изображения было одинаковым (например, userA.png всегда).

person Fahim Parkar    schedule 30.09.2014

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

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

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

Вы можете найти полные сведения о методе и объяснение здесь.

person Gautam Jain    schedule 24.08.2015

Последний Swift 3.0* и SDWebImage

SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)
person Urvish Modi    schedule 03.08.2017

Поток SDWebImage:

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

2) SDWebImage использует URL-адрес для получения изображения из кеша

3) SDWebImage проверяет:

если можно получить изображение из кеша - ОК

если нет (например, URL был изменен) - невозможно получить изображение из кеша

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

person Svitlana    schedule 04.05.2018

Как я прочитал в readme SDWeb в git, это может помочь:

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

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