第三方類庫:SDWebImage緩存圖片的機(jī)制

轉(zhuǎn)自http://www.overcode.hk/?p=4492013年的文章, 僅供參考
SDWebImage是一個(gè)很厲害的圖片緩存的框架芳绩。既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者對于圖片的緩存實(shí)際應(yīng)用的是NSURLCache自帶的cache機(jī)制舰攒。而NSURLCache每次都要把緩存的raw data 再轉(zhuǎn)化為UIImage逆日,就帶來了數(shù)據(jù)處理和內(nèi)存方面的更多操作痊银。具體的比較在這里
SDWebImage提供了如下三個(gè)category來進(jìn)行緩存宵蕉。
MKAnnotationView(WebCache)
UIButton(WebCache)
UIImageView(WebCache)

以最為常用的UIImageView為例:

  1. UIImageView+WebCache: setImageWithURL:placeholderImage:options:
    先顯示 placeholderImage ,同時(shí)由SDWebImageManager 根據(jù) URL 來在本地查找圖片节榜。
  2. SDWebImageManager: downloadWithURL:delegate:options:userInfo:
    SDWebImageManager是將UIImageView+WebCache同SDImageCache鏈接起來的類羡玛, SDImageCache: queryDiskCacheForKey:delegate:userInfo:
    用來從緩存根據(jù)CacheKey查找圖片是否已經(jīng)在緩存中
  3. 如果內(nèi)存中已經(jīng)有圖片緩存, SDWebImageManager會(huì)回調(diào)SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo:
  4. 而 UIImageView+WebCache 則回調(diào)SDWebImageManagerDelegate: webImageManager:didFinishWithImage:來顯示圖片宗苍。
  5. 如果內(nèi)存中沒有圖片緩存稼稿,那么生成 NSInvocationOperation 添加到隊(duì)列薄榛,從硬盤查找圖片是否已被下載緩存。
  6. 根據(jù) URLKey 在硬盤緩存目錄下嘗試讀取圖片文件渺杉。這一步是在 NSOperation 進(jìn)行的操作蛇数,所以回主線程進(jìn)行結(jié)果回調(diào) notifyDelegate:。
  7. 如果上一操作從硬盤讀取到了圖片是越,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過小耳舅,會(huì)先清空內(nèi)存緩存)。SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo:倚评。進(jìn)而回調(diào)展示圖片浦徊。
  8. 如果從硬盤緩存目錄讀取不到圖片,說明所有緩存都不存在該圖片天梧,需要下載圖片盔性,回調(diào) imageCache:didNotFindImageForKey:userInfo:
  9. 共享或重新生成一個(gè)下載器 SDWebImageDownloader
    開始下載圖片呢岗。
  10. 圖片下載由 NSURLConnection 來做冕香,實(shí)現(xiàn)相關(guān) delegate 來判斷圖片下載中、下載完成和下載失敗后豫。
  11. connection:didReceiveData: 中利用 ImageIO 做了按圖片下載進(jìn)度加載效果悉尾。
  12. connectionDidFinishLoading: 數(shù)據(jù)下載完成后交給 SDWebImageDecoder 做圖片解碼處理。
  13. 圖片解碼處理在一個(gè) NSOperationQueue 完成挫酿,不會(huì)拖慢主線程 UI构眯。如果有需要對下載的圖片進(jìn)行二次處理,最好也在這里完成早龟,效率會(huì)好很多惫霸。
  14. 在主線程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo: 回調(diào)給 SDWebImageDownloader葱弟。
  15. imageDownloader:didFinishWithImage: 回調(diào)給 SDWebImageManager 告知圖片下載完成壹店。
  16. 通知所有的 downloadDelegates 下載完成,回調(diào)給需要的地方展示圖片翘悉。
  17. 將圖片保存到 SDImageCache 中茫打,內(nèi)存緩存和硬盤緩存同時(shí)保存。
  18. 寫文件到硬盤在單獨(dú) NSInvocationOperation 中完成妖混,避免拖慢主線程老赤。
  19. 如果是在iOS上運(yùn)行,SDImageCache 在初始化的時(shí)候會(huì)注冊notification 到 UIApplicationDidReceiveMemoryWarningNotification 以及 UIApplicationWillTerminateNotification,在內(nèi)存警告的時(shí)候清理內(nèi)存圖片緩存制市,應(yīng)用結(jié)束的時(shí)候清理過期圖片抬旺。
  20. SDWebImagePrefetcher 可以預(yù)先下載圖片,方便后續(xù)使用祥楣。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末开财,一起剝皮案震驚了整個(gè)濱河市汉柒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌责鳍,老刑警劉巖碾褂,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異历葛,居然都是意外死亡正塌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門恤溶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乓诽,“玉大人,你說我怎么就攤上這事咒程○欤” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵帐姻,是天一觀的道長稠集。 經(jīng)常有香客問我,道長饥瓷,這世上最難降的妖魔是什么巍杈? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮扛伍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘词裤。我一直安慰自己刺洒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布吼砂。 她就那樣靜靜地躺著逆航,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渔肩。 梳的紋絲不亂的頭發(fā)上因俐,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音周偎,去河邊找鬼抹剩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蓉坎,可吹牛的內(nèi)容都是我干的澳眷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蛉艾,長吁一口氣:“原來是場噩夢啊……” “哼钳踊!你這毒婦竟也來了衷敌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤拓瞪,失蹤者是張志新(化名)和其女友劉穎缴罗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祭埂,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡面氓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沟堡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侧但。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖航罗,靈堂內(nèi)的尸體忽然破棺而出禀横,到底是詐尸還是另有隱情,我是刑警寧澤粥血,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布柏锄,位于F島的核電站,受9級(jí)特大地震影響复亏,放射性物質(zhì)發(fā)生泄漏趾娃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一缔御、第九天 我趴在偏房一處隱蔽的房頂上張望抬闷。 院中可真熱鬧,春花似錦耕突、人聲如沸笤成。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炕泳。三九已至,卻和暖如春上祈,著一層夾襖步出監(jiān)牢的瞬間培遵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工登刺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留籽腕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓塘砸,卻偏偏與公主長得像节仿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子掉蔬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容