[英]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-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)
此功能將刪除內存和磁盤中保存的現金,之后只需上傳您的新圖像即可完美運行。
轉到文件 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.