Что происходит с SDWebImage Cached Images в моем приложении при изменении файла изображения на сервере?
Я использую библиотеку SDWebImage
для кэширования веб-изображений в своем приложении:
https://github.com/rs/SDWebImage/blob/master/README.md
Текущее использование:
[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
Мой вопрос заключается в том, что происходит после кэширования изображения, а через пару дней этот файл изображения на сервере был обновлен новым изображением?
В настоящее время мое приложение по-прежнему отображает кешированное изображение.
Я не вижу ни одной документации по установке тайм-аута кеша или того, что распознает, что размер файла изменился.
Если у кого-то есть опыт использования этой конкретной библиотеки, тогда любая помощь будет принята с благодарностью.
Спасибо заранее.
Ответы
Ответ 1
Я посмотрел исходный код. Он обрабатывает метод setImageWithURL следующим образом:
- Задайте кеш в памяти, если изображение есть, если да, верните изображение и больше не ходите
- Задайте дисковый кеш, если изображение есть, если да, верните изображение и больше не ходите
- Попробуйте загрузить изображение, верните изображение с успехом, сохраните образ заполнителя.
Нет запроса, отправленного для запроса на удаленный сервер, если есть новая версия, в то время как на диске есть что-то старое, например, используя ETags протокол HTTP.
Копая немного глубже, время кеша устанавливается на статическое значение в SDImageCache.m
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
он не может быть изменен с помощью установщика.
До тех пор, пока изображение в кеше будет действительным, SDWebImage lib не загрузит ничего нового. Через неделю он загрузит измененное изображение.
Ответ 2
Вы можете использовать параметр options
.
[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"] options:SDWebImageRefreshCached];
Ура!
Ответ 3
Проблема с старением SDImageCache (у которого теперь есть setter: maxCacheAge) заключается в том, что SDWebImage никогда не проактивно ничего не делает с этим. В какой-то момент вам нужно вызывать cleanDisk, чтобы очистить старые данные из кеша. Примечание. SDWebImage вызывается cleanDisk, когда приложение завершается, но приложениям не гарантируется получение уведомления о прекращении работы с ОС.
Ответ 4
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];
}
Ответ 5
Если вы хотите изменить продолжительность кэша по умолчанию в Swift. Установите это в своем AppDelegate.
Версия 3:
SDWebImageManager.sharedManager().imageCache.maxCacheAge = CACHE_TIME_IN_SECONDS
Версия 4:
SDWebImageManager.shared().imageCache?.config.maxCacheAge = CACHE_TIME_IN_SECONDS
-
Я считаю, что это только эффекты изображения, которые являются кешами после того, как это значение установлено. IE, если ваше приложение кэширует изображение с истечением срока действия кеша по умолчанию, а затем изменит его на что-то еще, ваши изображения будут продолжать действовать только через неделю. Легкое решение этого - просто очистить кеш.
Ответ 6
Ниже я наблюдал.
-
Если имя изображения/путь одинаково, SDWebImage не будет загружать его снова в течение 1 недели.
-
Независимо от имени изображения, SDWebImage будет повторно загружать изображение через 1 неделю (с момента его загрузки).
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
-
У них есть одна База данных, в которой хранятся все URL-адреса изображений. Для них URL изображения похож на первичный ключ (уникальный ключ).
Итак, в основном, что они делают, это если URL-адрес изменен и не присутствует в БД, загрузите его.
С моей точки зрения, что они делают, ПРАВИЛЬНО. Ex. Если вы загружаете изображение, пусть говорят для пользователя A, имя изображения должно быть изменено, и это базовое. Я знаю, что некоторые разработчики предпочитают, чтобы имя изображения было таким же (например, userA.png).
Ответ 7
SDWebImage делает агрессивное кэширование по умолчанию. Но теперь они дают возможность уважать ваши заголовки управления кешированием HTTP и получать последнее изображение.
Для этого у них есть новый метод, в котором в параметрах вы можете передать SDWebImageRefreshCached
[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/xyz/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];
Подробные сведения и объяснения метода можно найти здесь здесь.
Ответ 8
Последние версии Swift 3.0 * и SDWebImage
SDWebImageManager.shared().imageCache?.deleteOldFiles(completionBlock: nil)
Ответ 9
Как я читал в режиме чтения SDWeb в git,
Это может помочь:
В вашем случае вы можете использовать флаг SDWebImageRefreshCached
. Это немного ухудшит производительность, но будет учитывать заголовки управления кешированием HTTP:
[imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];