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)一處理