簡體   English   中英

使用 SDWebImage 在服務器上更改圖像時如何更新緩存中的圖像

[英]How to update image in cache when image changed on server with SDWebImage

我正在使用 SDWebImage 庫從服務器下載圖像。 https://github.com/rs/SDWebImage

當圖像在服務器上使用相同的 url 更新時,SDWebImage 無法更新緩存的圖像。

SDWebImage默認會做一些緩存,所以如果圖像發生變化,最好使用新的 URL。 因此,例如,如果您可以控制 URL 並且可以在每次圖像更改時更改它,那么您可以這樣做。

如果不是這種情況,請嘗試在options字段中使用SDWebImageRefreshCached以遵守 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

當您設置SDWebImageRefreshCached選項時, SDWebImage使用NSURLCache Apple 的 URL 加載系統實現了 HTTP 緩存,包括緩存響應驗證。 HTTP 緩存相當復雜,但是有很多關於 HTTP 緩存的初學者指南:

基本上,服務器需要在每個響應中包含一些 HTTP 緩存控制標頭。 有許多不同的策略可用於實施重新驗證。 您可以使用Last-ModifiedETag 這樣,每次客戶端發送請求時,它都會自動在您的請求中包含來自先前緩存響應的Last-ModifiedETag值。 如果圖像沒有改變,服務器將以狀態碼 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)

此功能將刪除內存和磁盤中保存的現金,之后只需上傳您的新圖像即可完美運行。

轉到文件 SDWebImageManager.m 中的第 176 行並更改這一行

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 現在可以知道服務器上的圖像已更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM