SDWebImage加載url不變圖片更新方法

1. 問題引入


我想很多開發者都在使用SDWebImage,SDWebImage以其便捷性深受開發者歡迎。

不過長期使用以后,可能你會發現的有時候也不是那么給力?

主要問題表現在哪里呢?
很多app都有用戶的概念,用戶一般都會有頭像,基本上都上傳到服務器上,而服務器往往也支持在pc端更新頭像(比如微博、QQ等)。
如果你的頭像使用SDWebImage設置的,那么你會發現,pc端更新頭像后,客戶端可能(往往)不會自動更新!!!

很多開發者會建議你設置SDWebImageRefreshCached標識,甚至SDWebImage的官網也這么說!
那么SDWebImageRefreshCached到底能否解決我們的問題呢?

image.png
image.png

2. 原理分析


我們來簡單探討一下SDWebImage的實現原理:
SDWebImageManager內部利用SDWebImageDownloader來下載,它的緩存策略有兩種,一種是用NSURL緩存,一種是自己定義了SDImageCache(內部使用NSCache)進行緩存。
如果設置了SDWebImageRefreshCached標示位,那么SDWebImageDownloader則利用NSURL進行緩存,而且使用的policy為NSURLRequestUseProtocolCachePolicy。

那么如果設置了SDWebImageRefreshCached標識位,圖片是否更新則要取決于你服務器的cache-control設置了,如果沒有cache-control的話,客戶端則然享受不了自動更新的功能。
所以說僅僅設置SDWebImageRefreshCached往往是不能解決問題的。。。。

那么如何查看服務器是否支持cache-control呢?
其實簡單,只需要要終端輸入

 curl [url] --head

即可。

3. 解決方案分析:


那么如何讓SDWebImage支持自動更新呢?
實現方法有幾種:

  1. 讓服務器更新url,也就是說服務器端如果更新了頭像,那么就生成新的url(推薦)
  2. 讓服務器端支持cache-control
  3. 修改SDWebImage,讓它支持http的Last-Modified或者etag(前提是服務器端也要支持)

參考文獻:
瀏覽器緩存詳解:expires,cache-control,last-modified,etag詳細說明
iOS網絡緩存掃盲篇--使用兩行代碼就能完成80%的緩存需求
SDWebImage使用SDWebImageRefreshCached后,圖片沒有刷新的問題討論

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,252評論 4 61
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 好多開發者,尤其是工作沒有多久的新手,比較喜歡關注細節的東西。 我做移動開發好多年了,有一個感覺就是,技術沒有秘密...
    汝陰龍閱讀 712評論 0 0
  • 音級 樂音體系中的各個音,如1234567 就是各個音級。 全音和半音 把一個八度的距離等分為12等份,每一份就是...
    debugman007閱讀 1,916評論 0 2
  • 面臨找工作的大四學姐的呼喊
    tt逃亡閱讀 274評論 0 0