Я использую библиотеку SDWebImage для загрузки изображений с сервера. https://github.com/rs/SDWebImage
SDWebImage не может обновить кешированное изображение, когда изображение обновляется на сервере с тем же URL-адресом.
Я использую библиотеку SDWebImage для загрузки изображений с сервера. https://github.com/rs/SDWebImage
SDWebImage не может обновить кешированное изображение, когда изображение обновляется на сервере с тем же URL-адресом.
SDWebImage
по умолчанию выполняет некоторое кэширование, поэтому было бы лучше использовать новый URL-адрес, если изображение изменится. Так, например, если у вас есть контроль над URL-адресом и вы можете изменять его каждый раз, когда изображение меняется, вы можете это сделать.
Если это не так, попробуйте использовать SDWebImageRefreshCached
в поле options
, чтобы учитывать заголовки управления кешем HTTP, например:
[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"]
placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"]
options:SDWebImageRefreshCached];
Подробнее см. здесь
Обновление: я написал целое руководство по кешу, включая проверку кеша https://kean.github.io/blog/image-caching
SDWebImage
использует NSURLCache
, когда вы устанавливаете опцию SDWebImageRefreshCached
. Система загрузки URL-адресов Apple реализует HTTP-кеш, включая проверку кэшированных ответов. HTTP-кеширование довольно сложное, однако существует множество руководств по HTTP-кэшированию для начинающих:
По сути, серверу необходимо включать некоторые заголовки управления кешем HTTP в каждый ответ. Существует множество различных стратегий, которые можно использовать для реализации повторной валидации. Вы можете использовать Last-Modified
или ETag
. Таким образом, каждый раз, когда клиент отправляет запрос, он автоматически включает в ваш запрос значение Last-Modified
или ETag
из ранее кэшированного ответа. Если изображение не изменилось, сервер ответит кодом состояния 302 (не изменено), и NSURLConnection/NSURLSession
прозрачно предоставит вам кэшированный ответ от NSURLCache
. Вам не нужно загружать данные снова, но вам все равно нужно сверяться с сервером каждый раз, когда вы делаете запрос.
Вы также можете указать дату истечения срока действия с помощью управления кешем HTTP. Если используется механизм истечения срока действия, NSURLConnection/NSURLSession
не будет перепроверять кэшированный ответ до тех пор, пока срок его действия не истечет.
Дополнительные сведения об управлении кешем HTTP см. по ссылкам выше. HTTP-кеш — это универсальный механизм кэширования, который следует использовать по возможности.
Я бы рекомендовал использовать фреймворк Nuke для загрузки изображений (отказ от ответственности: написано мной). Он использует NSURLCache
по умолчанию, но при этом имеет кеш памяти, в котором хранятся распакованные изображения.
Вот код в swift 3 для обновления кеша каждый раз
imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached)
Swift 4 Просто используйте следующую функцию в библиотеке SDWebImage:
SDImageCache.shared().removeImage(forKey: (ImagePath), withCompletion: nil)
Эта функция удалит сохраненную наличность в памяти и на диске, после чего просто загрузите новое изображение, и оно будет работать отлично.
Перейдите к строке номер 176 в файле SDWebImageManager.m и измените эту строку
if (options & SDWebImageRefreshCached) downloaderOptions |= SDWebImageDownloaderUseNSURLCache;
код ниже.
if (options & SDWebImageRefreshCached) {
// force progressive off if image already cached but forced refreshing
downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload;
// remove SDWebImageDownloaderUseNSURLCache flag
downloaderOptions &= ~SDWebImageDownloaderUseNSURLCache;
//ignore image read from NSURLCache if image is cached but force refreshing
downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse;
}
Для меня это сработало как шарм.
Если URL-адрес не изменен, теперь SDWebImage может узнать, что изображение было изменено на сервере.