SDWebImage加載圖片的流程、緩存和下載是如何實(shí)現(xiàn)的

1荡灾、SDWebImage結(jié)構(gòu):

1)SDWebImageManager主要分配任務(wù)瓤狐,
①UI的擴(kuò)展UIButton分類、MKAnnotationView分類批幌、UIImageView分類础锐、UIView分類和FLAnimatedImageView分類等可以讓使用者易于調(diào)起SDWebImageManager中的方法,
②圖片下載SDWebImageDownloader
③圖片緩存SDWebImageCache

2荧缘、加載圖片的流程:

UI調(diào)用sd_setImageWithURL()
-->接著內(nèi)部UIView擴(kuò)展調(diào)用sd_internalSetImageWithURL()
--> SDWebImageManager調(diào)用loadImageWithURL()
--> SDWebImageCache查找緩存queryDiskCacheForKey()皆警,內(nèi)存緩存和磁盤(pán)緩存
--> SDWebImageDownloader下載圖片downloadImage(url, options, progress, completed)
-->返回的圖片network result存儲(chǔ)到內(nèi)存或磁盤(pán)緩存中storeImage(),便于下次直接從緩存中獲取圖片
-->獲取的圖片image顯示到UI界面setImage

1)sd_internalSetImageWithURL()截粗,加載圖片信姓、查詢圖片都是執(zhí)行任務(wù),當(dāng)前任務(wù)存儲(chǔ)在全局的NSMapTable中桐愉,判斷當(dāng)前是否有任務(wù)進(jìn)行财破,取消當(dāng)前任務(wù)是從NSMapTable中加鎖通過(guò)key查找operation取消掰派,下載時(shí)會(huì)返回operation并存儲(chǔ)在全局的NSMapTable中
2)loadImageWithURL()从诲,初始化SDWebImageManager、下載進(jìn)度progress靡羡,然后先加載緩存再進(jìn)行下載系洛,圖片加載完成后對(duì)圖片進(jìn)行處理回調(diào)或者給UI在runloop中刷新顯示

3、緩存機(jī)制

內(nèi)存和磁盤(pán)雙緩存
SDImageCacheConfig:緩存的配置
》是否壓縮圖片略步,提高性能描扯,但是特大圖片會(huì)導(dǎo)致內(nèi)存暴增此時(shí)可以單獨(dú)設(shè)置圖片不進(jìn)行壓縮
》是否緩存圖片,
》是否使用低內(nèi)存警告趟薄,
》maxCacheAge最大存儲(chǔ)時(shí)間绽诚,單位是秒,默認(rèn)緩存一周杭煎,在內(nèi)存緩存中有幾種情況下會(huì)自動(dòng)刪除恩够,超過(guò)最長(zhǎng)時(shí)間后磁盤(pán)緩存會(huì)自動(dòng)刪除
》maxCacheSize最大緩存空間,單位是字節(jié)
》diskCacheExpireType圖片存儲(chǔ)過(guò)期類型
SDImageCache:緩存查找的邏輯
1)SDMemoryCache內(nèi)存緩存:繼承自NSCache羡铲,重寫(xiě)方法實(shí)現(xiàn)更多功能的緩存蜂桶,使用NSMapTable實(shí)現(xiàn)緩存,NSMapTable是一種數(shù)據(jù)結(jié)構(gòu)類似于NSDictionary擁有更多的內(nèi)存語(yǔ)義(copy也切、assign扑媚、strong腰湾,NSCoping),存儲(chǔ)的key使用強(qiáng)引用疆股,value使用弱引用费坊,當(dāng)對(duì)象釋放之后NSMapTable會(huì)自動(dòng)刪除當(dāng)前的key和value,不會(huì)對(duì)之外的對(duì)象產(chǎn)生影響押桃。監(jiān)聽(tīng)didReceiveMemoryWarning清除當(dāng)前的內(nèi)存緩存葵萎。重寫(xiě)NSCache方法setObject:forKey:cost:,首先在NSCache中緩存唱凯,如果不使用shouldUseWeakMemoryCache則只存儲(chǔ)在NSCache中羡忘,否則會(huì)在NSMapTable中再存儲(chǔ)一遍,如果NSCache中取出的為空磕昼,在NSMapTable中再取一次然后同步存儲(chǔ)到NSCache中卷雕,防止NSCache自動(dòng)清除緩存,這樣以空間換取時(shí)間提高查找緩存的效率票从。
2)SDDiskCache磁盤(pán)緩存漫雕,首先創(chuàng)建一個(gè)磁盤(pán)目錄存放緩存,每一個(gè)文件都會(huì)生成一個(gè)MD5文件名以標(biāo)記文件的唯一性
3)查詢緩存峰鄙,loadImageWithURL()中imageCache調(diào)用queryCacheOperation方法浸间,先從內(nèi)存緩存查找,再?gòu)拇疟P(pán)緩存創(chuàng)建任務(wù)NSOperation查找吟榴,找到后返回圖片魁蒜,查找過(guò)程中會(huì)產(chǎn)生臨時(shí)變量,為了及時(shí)釋放將查找過(guò)程放入autoreleasepool吩翻,找到磁盤(pán)目錄兜看,從磁盤(pán)中查找MD5文件名的二進(jìn)制文件,然后轉(zhuǎn)換成UIImage對(duì)象狭瞎,再存到內(nèi)存緩存中
4)storeImage:存儲(chǔ)到內(nèi)存緩存和磁盤(pán)緩存细移,可以選擇是否存入磁盤(pán)的方法,默認(rèn)是存磁盤(pán)熊锭,storeImageToDisk存儲(chǔ)到磁盤(pán)

4弧轧、下載圖片

NSURLSession進(jìn)行圖片下載
1)SDWebImageDownloader處理請(qǐng)求頭、參數(shù)初始化等公共信息碗殷,管理下載隊(duì)列的先后順序精绎、最大下載量、https等亿扁,downloadImageWithUrl:處理下載邏輯捺典,創(chuàng)建Operation,設(shè)置request的cookie从祝、header襟己、證書(shū)NSURLCredential引谜、下載任務(wù)優(yōu)先級(jí)等各項(xiàng)信息,優(yōu)先級(jí)有兩種先進(jìn)先出和后進(jìn)先出LIFO擎浴,默認(rèn)是先進(jìn)先出员咽,通過(guò)Operation來(lái)添加依賴實(shí)現(xiàn)優(yōu)先級(jí),后進(jìn)先出是最近的任務(wù)需要依賴于新進(jìn)來(lái)的任務(wù)執(zhí)行完成后才執(zhí)行之前的任務(wù)贮预。
2)SDWebImageDownloaderOperation繼承自NSOperation實(shí)現(xiàn)圖片下載贝室,重寫(xiě)start方法,開(kāi)啟task[task resume]仿吞,在當(dāng)前的NSOperation代理回調(diào)中處理數(shù)據(jù)滑频,回調(diào)的數(shù)據(jù)放在SDWebImageDownloaderOperation的delegate中統(tǒng)一處理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市唤冈,隨后出現(xiàn)的幾起案子峡迷,更是在濱河造成了極大的恐慌,老刑警劉巖你虹,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绘搞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡傅物,警方通過(guò)查閱死者的電腦和手機(jī)夯辖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)董饰,“玉大人蒿褂,你說(shuō)我怎么就攤上這事〖饫” “怎么了贮缅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵榨咐,是天一觀的道長(zhǎng)介却。 經(jīng)常有香客問(wèn)我,道長(zhǎng)块茁,這世上最難降的妖魔是什么齿坷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮数焊,結(jié)果婚禮上永淌,老公的妹妹穿的比我還像新娘。我一直安慰自己佩耳,他們只是感情好遂蛀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著干厚,像睡著了一般李滴。 火紅的嫁衣襯著肌膚如雪螃宙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天所坯,我揣著相機(jī)與錄音谆扎,去河邊找鬼。 笑死芹助,一個(gè)胖子當(dāng)著我的面吹牛堂湖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播状土,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼无蜂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蒙谓?” 一聲冷哼從身側(cè)響起酱讶,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彼乌,沒(méi)想到半個(gè)月后泻肯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慰照,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年灶挟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毒租。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡稚铣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墅垮,到底是詐尸還是另有隱情惕医,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布算色,位于F島的核電站抬伺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏灾梦。R本人自食惡果不足惜峡钓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望若河。 院中可真熱鬧能岩,春花似錦、人聲如沸萧福。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至膏燕,卻和暖如春炭庙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煌寇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工焕蹄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阀溶。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓腻脏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親银锻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子永品,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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