1. 問題引入
我想很多開發者都在使用SDWebImage,SDWebImage以其便捷性深受開發者歡迎。
不過長期使用以后,可能你會發現的有時候也不是那么給力?
主要問題表現在哪里呢?
很多app都有用戶的概念,用戶一般都會有頭像,基本上都上傳到服務器上,而服務器往往也支持在pc端更新頭像(比如微博、QQ等)。
如果你的頭像使用SDWebImage設置的,那么你會發現,pc端更新頭像后,客戶端可能(往往)不會自動更新!!!
很多開發者會建議你設置SDWebImageRefreshCached
標識,甚至SDWebImage的官網也這么說!
那么SDWebImageRefreshCached到底能否解決我們的問題呢?
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支持自動更新呢?
實現方法有幾種:
- 讓服務器更新url,也就是說服務器端如果更新了頭像,那么就生成新的url(推薦)
- 讓服務器端支持cache-control
- 修改SDWebImage,讓它支持http的Last-Modified或者etag(前提是服務器端也要支持)
參考文獻:
瀏覽器緩存詳解:expires,cache-control,last-modified,etag詳細說明
iOS網絡緩存掃盲篇--使用兩行代碼就能完成80%的緩存需求
SDWebImage使用SDWebImageRefreshCached后,圖片沒有刷新的問題討論