本人親測(cè)有效赡茸,如果有錯(cuò)缎脾,希望大家指出。我的SDWebImage版本是(4.4.1)?pod 'SDWebImage', '~> 4.4.1' (應(yīng)該是在4.0以上的都可以)
? 方法是
?[imageview sd_setImageWithURL:[NSURL URLWithString:url ]placeholderImage:nil options:SDWebImageRefreshCached];
我之前的寫法是:
?[imageview sd_setImageWithURL:[NSURL URLWithString:url ]placeholderImage:nil ];
區(qū)別在于多加啦一個(gè)參數(shù):options:SDWebImageRefreshCached
SDWebImageRefreshCached參數(shù)設(shè)置之后占卧,會(huì)怎么樣遗菠?
不使用SDWebImage提供的內(nèi)存緩存和硬盤緩存
采用NSURLCache提供的緩存,有效時(shí)間只有5秒
圖片不一致的問(wèn)題是解決了华蜒,不過(guò)效果跟不使用緩存差別不大
個(gè)人建議這個(gè)參數(shù)還是不要用為好辙纬,為了一個(gè)小特性,丟掉了SDWebImage最核心的特色叭喜。
解決方案
方案1
后臺(tái)給的url中增加字段贺拣,表示圖片是否更新,比如增加一個(gè)timestamp字段.圖片更新了捂蕴,就更新下這個(gè)字段譬涡;
對(duì)客戶端來(lái)說(shuō),只要這個(gè)timestamp字段變了啥辨,整個(gè)url就不一樣了涡匀,就會(huì)從網(wǎng)絡(luò)取圖片。比如http://xxx/xx? timestamp=xxx
也可以添加圖片文件的md5來(lái)表示文件是否更新溉知,比如http://xxx/xx? md5=xxx渊跋。并且md5比時(shí)間戳要好,這是強(qiáng)校驗(yàn)着倾。時(shí)間戳在服務(wù)器回滾或者服務(wù)器重啟的時(shí)候會(huì)有特殊的邏輯拾酝。不過(guò)大多數(shù)時(shí)候時(shí)間戳也夠用了。
====這個(gè)方案客戶端不用改卡者,后臺(tái)改動(dòng)也不會(huì)太大蒿囤。====強(qiáng)烈推薦
方案2
客戶端修改緩存策略,只用內(nèi)存緩存崇决,不用磁盤緩存材诽。就是設(shè)置SDWebImageCacheMemoryOnly參數(shù)底挫。
這個(gè)方案的好處是服務(wù)端不用改,客戶端改動(dòng)很少脸侥。
但是問(wèn)題是程序關(guān)閉又打開之后建邓,緩存就沒(méi)了,需要訪問(wèn)網(wǎng)絡(luò)睁枕,重新加載圖片官边,緩存性能下降很多
方案3
客戶端修改緩存時(shí)間。目前的緩存有效時(shí)間為7天外遇,有點(diǎn)長(zhǎng)注簿;可以修改為一個(gè)經(jīng)驗(yàn)值,比如1天跳仿?1小時(shí)诡渴?
這個(gè)方案的好處是服務(wù)端不用改,客戶端也改動(dòng)很少菲语,緩存性能下降程度比方案二要小一點(diǎn)妄辩;
缺點(diǎn)是:在緩存時(shí)間內(nèi),不一致的問(wèn)題還是存在的山上,問(wèn)題只是減輕眼耀,并沒(méi)有消除
方案4
客戶端不用現(xiàn)在的第三方庫(kù)(SDWebImage),(設(shè)置SDWebImageCacheMemoryOnly參數(shù)方案不推薦)胶哲,采用系統(tǒng)API實(shí)現(xiàn)(NSURLCache)畔塔。服務(wù)端利用Http的頭部字段進(jìn)行緩存控制潭辈。
Cache-Control:可以設(shè)定緩存有效時(shí)間鸯屿,默認(rèn)是5s,具體時(shí)間由服務(wù)端設(shè)置把敢。設(shè)置一個(gè)經(jīng)驗(yàn)值寄摆,1天?1小時(shí)修赞?
Last-Modified/If-Modified-Since:時(shí)間戳婶恼。有更新服務(wù)端就返回200,客戶端下載柏副,更新圖片勾邦;沒(méi)更新,服務(wù)端就返回304割择,客戶端使用本地緩存眷篇。
Etag/If-None-Match:標(biāo)簽,一般用MD5值荔泳。有更新服務(wù)端就返回200蕉饼,客戶端下載虐杯,更新圖片;沒(méi)更新昧港,服務(wù)端就返回304擎椰,客戶端使用本地緩存。
這個(gè)方案的優(yōu)點(diǎn)是:服務(wù)端控制緩存创肥,并且既有全局控制(緩存有效時(shí)間)达舒,又有特定的控制(時(shí)間戳或者M(jìn)D5標(biāo)簽)
缺點(diǎn):客戶端不能利用成熟的第三方庫(kù),需要自己實(shí)現(xiàn)圖片緩存瓤的,非主流用法休弃。服務(wù)端改動(dòng)也非常大。====不推薦
備注:
選方案1的應(yīng)該普遍一點(diǎn)圈膏,比較簡(jiǎn)單塔猾;
選方案4也是可以的,不過(guò)要求服務(wù)端客戶端配合開發(fā)稽坤,并且也沒(méi)有必要用SDWebImage丈甸,直接用系統(tǒng)API來(lái)做就是了
總結(jié):這是一道經(jīng)常問(wèn)的面試題,希望對(duì)你有幫助尿褪。謝謝你的閱讀睦擂,如有不妥的請(qǐng)指出!