Что происходит с кэшированными изображениями SDWebImage в моем приложении при изменении файла изображения на сервере?
Я использую SDWebImage
библиотека для кэширования веб-изображений в моем приложении:
https://github.com/rs/SDWebImage/blob/master/README.md
Текущее Использование:
[imageView setImageWithURL:[NSURL URLWithString:profilePictureUrl] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
мой вопрос в том, что происходит после кэширования изображения, а затем через пару дней этот файл изображения на сервере был обновлен новым изображением?
на данный момент мое приложение все еще отображает кэшированное изображение.
Я не вижу в любом документации по установке тайм-аута кэша или чего-то, что распознает, что размер файла изменился.
Если у кого-то есть опыт использования этой конкретной библиотеки, то любая помощь будет очень признательна.
спасибо заранее.
10 ответов
Я взглянул на исходный код. Он обрабатывает setImageWithURL
способ такой:
- спросите кэш памяти, если изображение есть, если да вернуть изображение и не идти дальше
- спросите кеш диска, если изображение есть, если да, верните изображение и не идите дальше
- попробуйте загрузить изображение, вернуть изображение на успех, иначе Сохранить Изображение-заполнитель
нет запроса, отправленного, чтобы спросить удаленный сервер, если там является новой версией, пока на диске есть что-то старое, например, использование теги 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 если ваше приложение кэширует изображение с истечением кэша по умолчанию, а затем изменить его что-то еще, ваши изображения по-прежнему будет истекать только через неделю. Простое решение этого - просто очистить кэш.
ниже то, что я заметил.
Если имя/ путь изображения одинаковы, SDWebImage не будет загружать его снова в течение 1 недели.
-
независимо от имени изображения, SDWebImage будет повторно загрузить изображение через 1 неделю (с момента его загрузки).
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
у них есть одна база данных, где хранятся все 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
необходимо извлечь изображения из сервер снова