SDWebImage圖片二級緩存異步加載基本原理

關于SDWebImage

SDWebImage是一個針對圖片加載的插件庫田晚,提供了一個支持緩存的用于異步加載圖片的下載工具辅肾,特別的為常用的UI元素:UIImageView,UIButton和MKAnnotationView提供了Category類別擴展,可以作為一個很方便的工具。其中SDWebImagePrefetcher可以預先下載圖片睁壁,方便后續(xù)使用塌碌。UIImage支持的圖片格式(JPEG,PNG等等)包括GIF都可以被支持惋耙;Web圖片格式措近,包括動態(tài)的Web圖片(使用WebP subspec)Github地址https://github.com/rs/SDWebImage

SDWebImage的幾點特性

1為UIImageView,UIButton和MKAnnotationView進行了類別擴展,添加了web圖片和緩存管理盖袭;

2是一個異步圖片下載器失暂;

3異步的內存+硬盤緩沖以及自動的緩沖過期處理彼宠;

4后臺圖片解壓縮功能;

5可以保證相同的url(圖片的檢索key)不會被重復多次下載弟塞;

6可以保證假的無效url不會不斷嘗試去加載凭峡;

7保證主線程不會被阻塞;

8使用GCD和runtime知識决记;

使用方法示例

SDWebImage的使用非常簡單摧冀,開發(fā)中需要的主要就是為一個UIImageView添加在線圖片,用到的函數(shù)主要就是sd_setImageWithURL函數(shù)(新版本函數(shù)名都加了sd前綴)系宫,sd_setImageWithURL函數(shù)提供了幾種重載方法索昂,包括只使用圖片URL參數(shù)的,以及設置占位圖片placeholderImage參數(shù)的等等扩借,這個函數(shù)也是框架封裝的最頂層的應用函數(shù)椒惨,開發(fā)中實際主要就用這個函數(shù)即可,以這個函數(shù)為入口潮罪,可以層層打開往底層看康谆,可以對應到SDWebImage的整個加載邏輯和流程。

#import <SDWebImage/UIImageView+WebCache.h>

使用SDWebImage框架為UIImageView加載在線圖片

[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.***.com/***/image.jpg"]placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

SDWebImage 加載圖片的流程原理


根據(jù)流程可以知道嫉到,圖片的加載采用了一種二級緩存機制沃暗,簡單概括意思就是:能從內存緩存直接取就從內存緩存取,內存緩存沒有就去硬盤緩存里取何恶,再沒有就根據(jù)提供的URL到網(wǎng)上下載(下載自然會慢很多)孽锥,下載的圖片還有一個解碼的過程,解碼后就可以直接用了细层,另外下載的圖片會保存到內存緩存和硬盤緩存惜辑,從而下次再取同樣的圖片就可以直接取了而不用重復下載。


上面的整個流程對應到SDWebImage框架內部今艺,依次會挖掘出下面幾個關鍵函數(shù)韵丑,最外層的也就是我們直接調用的sd_setImageWithURL函數(shù),以此函數(shù)為入口依次可能會調用到后面的函數(shù)虚缎,來完成上面的整個優(yōu)化加載流程,這里以其中一個入口函數(shù)為例:

sd_setImageWithURL: UIImageView(WebCache)的sd_setImageWithURL函數(shù)只是個UIView的類擴展接口函數(shù)钓株,負責調用并將參數(shù)傳給UIView(WebCache)的sd_internalSetImageWithURL函數(shù)实牡,參數(shù)這里有圖片的url和placeholder占位圖片;

sd_internalSetImageWithURL:UIView(WebCache)的sd_internalSetImageWithURL函數(shù)首先將placeholder展位圖片異步顯示轴合,然后給SDWebImageManager單例發(fā)送loadImageWithURL消息创坞,傳給它url參數(shù)讓其再給它的SDImageCache對象發(fā)送queryCacheOperationForKey消息先從本地搜索緩存圖片;

loadImageWithURL:收到loadImageWithURL消息后受葛,SDWebImageManager單例向SDImageCache對象發(fā)送queryCacheOperationForKey消息開始在本地搜索緩存圖片题涨,SDImageCache對象先對自己發(fā)送imageFromMemoryCacheForKey消息從內存中搜索圖片緩存偎谁,搜到則取出圖片并通過SDCacheQueryCompletedBlock回調返回,否則再對自己發(fā)送diskImageForKey消息去硬盤搜索圖片纲堵,搜到則取出圖片通過SDCacheQueryCompletedBlock回調返回巡雨,內存和硬盤都搜不到則只好重新下載;

downloadImageWithURL:如果本地搜索失敗席函,SDWebImageManager會新建一個SDWebImageDownloader下載器铐望,并向下載器發(fā)送downloadImageWithURL消息開始下載網(wǎng)絡圖片;下載成功并解碼后一方面將圖片緩存到本地茂附,另一方面取出圖片進行顯示正蛙。其中像圖片下載以及圖片解碼等耗時操作都是異步執(zhí)行,不會拖慢主線程营曼。

SDImageCache在初始化的時候會注冊一些消息通知乒验,在內存警告或退到后臺的時候會清理內存圖片緩存,應用結束的時候會清理掉過期的圖片蒂阱。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锻全,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒜危,更是在濱河造成了極大的恐慌虱痕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辐赞,死亡現(xiàn)場離奇詭異部翘,居然都是意外死亡,警方通過查閱死者的電腦和手機响委,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門新思,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赘风,你說我怎么就攤上這事夹囚。” “怎么了邀窃?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵荸哟,是天一觀的道長。 經(jīng)常有香客問我瞬捕,道長鞍历,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任肪虎,我火速辦了婚禮劣砍,結果婚禮上,老公的妹妹穿的比我還像新娘扇救。我一直安慰自己刑枝,他們只是感情好香嗓,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著装畅,像睡著了一般靠娱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洁灵,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天饱岸,我揣著相機與錄音,去河邊找鬼徽千。 笑死苫费,一個胖子當著我的面吹牛,可吹牛的內容都是我干的双抽。 我是一名探鬼主播百框,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牍汹!你這毒婦竟也來了铐维?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤慎菲,失蹤者是張志新(化名)和其女友劉穎嫁蛇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體露该,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡睬棚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了解幼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抑党。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撵摆,靈堂內的尸體忽然破棺而出底靠,到底是詐尸還是另有隱情,我是刑警寧澤特铝,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布暑中,位于F島的核電站,受9級特大地震影響鲫剿,放射性物質發(fā)生泄漏痒芝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一牵素、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澄者,春花似錦笆呆、人聲如沸请琳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俄精。三九已至,卻和暖如春榕堰,著一層夾襖步出監(jiān)牢的瞬間竖慧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工逆屡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留圾旨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓魏蔗,卻偏偏與公主長得像砍的,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子莺治,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容