Как обновить изображение в кеше при изменении изображения на сервере с помощью SDWebImage

Я использую библиотеку SDWebImage для загрузки изображений с сервера. https://github.com/rs/SDWebImage

SDWebImage не может обновлять кэшированное изображение, когда изображение обновляется на сервере с тем же URL-адресом.

Ответ 1

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];

Подробнее здесь

Ответ 2

Обновление: Я на самом деле написал полное руководство по кешу, включая проверку кэша 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 по умолчанию, все еще имея кэш памяти, который содержит распакованные изображения.

Ответ 3

Вот код в swift 3, чтобы обновлять кеш каждый раз

imgCardBack.sd_setImage(with: URL(string: objUserData.back_image!), placeholderImage:UIImage(named: "cardBack"), options: .refreshCached)

Ответ 4

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