1. 問題引入
我想很多開發(fā)者都在使用SDWebImage昧捷,SDWebImage以其便捷性深受開發(fā)者歡迎。
不過長期使用以后,可能你會發(fā)現(xiàn)的有時候也不是那么給力?
主要問題表現(xiàn)在哪里呢盯滚?
很多app都有用戶的概念,用戶一般都會有頭像酗电,基本上都上傳到服務(wù)器上魄藕,而服務(wù)器往往也支持在pc端更新頭像(比如微博、QQ等)撵术。
如果你的頭像使用SDWebImage設(shè)置的背率,那么你會發(fā)現(xiàn),pc端更新頭像后嫩与,客戶端可能(往往)不會自動更新G拮恕!蕴纳!
很多開發(fā)者會建議你設(shè)置SDWebImageRefreshCached
標識会油,甚至SDWebImage的官網(wǎng)也這么說个粱!
那么SDWebImageRefreshCached到底能否解決我們的問題呢古毛?
2. 原理分析
我們來簡單探討一下SDWebImage的實現(xiàn)原理:
SDWebImageManager內(nèi)部利用SDWebImageDownloader來下載,它的緩存策略有兩種都许,一種是用NSURL緩存稻薇,一種是自己定義了SDImageCache(內(nèi)部使用NSCache)進行緩存。
如果設(shè)置了SDWebImageRefreshCached標示位胶征,那么SDWebImageDownloader則利用NSURL進行緩存塞椎,而且使用的policy為NSURLRequestUseProtocolCachePolicy。
那么如果設(shè)置了SDWebImageRefreshCached標識位睛低,圖片是否更新則要取決于你服務(wù)器的cache-control設(shè)置了案狠,如果沒有cache-control的話服傍,客戶端則然享受不了自動更新的功能。
所以說僅僅設(shè)置SDWebImageRefreshCached往往是不能解決問題的骂铁。吹零。。拉庵。
那么如何查看服務(wù)器是否支持cache-control呢灿椅?
其實簡單,只需要要終端輸入
curl [url] --head
即可钞支。
3. 解決方案分析:
那么如何讓SDWebImage支持自動更新呢茫蛹?
實現(xiàn)方法有幾種:
- 讓服務(wù)器更新url,也就是說服務(wù)器端如果更新了頭像烁挟,那么就生成新的url(推薦)
- 讓服務(wù)器端支持cache-control
- 修改SDWebImage婴洼,讓它支持http的Last-Modified或者etag(前提是服務(wù)器端也要支持)
參考文獻:
瀏覽器緩存詳解:expires,cache-control,last-modified,etag詳細說明
iOS網(wǎng)絡(luò)緩存掃盲篇--使用兩行代碼就能完成80%的緩存需求
SDWebImage使用SDWebImageRefreshCached后,圖片沒有刷新的問題討論