SDWebImage源碼解析

SDWebImage提供了簡潔的對外接口,用戶只需要調用- (void)sd_setImageWithURL:(nullable NSURL *)url;或是加上 placeholderImage 就可以實現(xiàn)圖片的自動下載和2級緩存,那他內部是如何實現(xiàn)這些功能的呢猜嘱?

一. 目錄結構:

** 從下圖中我們可以看到:大致功能結構可以分為下載類蜓堕,緩存類(內存和磁盤)蝠引,工具類管理類以及對于UIKit的一些類別院领。**


工程結構.png

二. 功能劃分:

大致功能可以分為:

  • 一個異步的圖片加載器
  • 一個異步的內存+磁盤圖片緩存,并具有自動緩存過期處理功能
  • 支持GIF跺嗽、WebP圖片
  • 后臺圖片解壓縮處理
  • 確保同一個URL的圖片不被下載多次
  • 確保下載及緩存時,主線程不被阻塞
實現(xiàn)流程.png

三. 實現(xiàn)原理:

上圖即為實現(xiàn)流程圖页藻,當調用sd_setImageWithURL ..方法的時候抛蚁,實際上是調用 **UIImageView+WebCache **此類別的方法,他內部回去調用 sd_internalSetImageWithURL: ..此方法中做了不少事情惕橙,首先會根據(jù)獲取的key把當前操作cancel掉:

 [self sd_cancelImageLoadOperationWithKey:validOperationKey];

然后根據(jù)屬性設置placeholder和activityIndicator瞧甩,如果url存在接下來的SDWebImageManager就是工程最核心的地方了,他會創(chuàng)建一個sharedManager單例弥鹦,調用loadImageWithURL ..方法獲取圖片肚逸,首先會根據(jù)SDWebImageCache類去以url為key到內存中去尋找圖片的緩存,如果緩存未命中就會用MD5加密過的key去磁盤中繼續(xù)查詢, 如果找到了, 就會把磁盤中的緩存?zhèn)浞莸絻却嬷斜蚧担划斎浑伲绻麅却婧痛疟P都沒有該圖片數(shù)據(jù),那么內部的SDWebImageDownloader對象就會調用

- (nullable SDWebImageDownloadToken *)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock
                                       completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock
                                               forURL:(nullable NSURL *)url
                                       createCallback:(SDWebImageDownloaderOperation *(^)())createCallback  

這個方法首先會把下載的操作添加到下載和完成的回調栓始,里面實現(xiàn)是調用

- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock
                        completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock {
SDCallbacksDictionary *callbacks = [NSMutableDictionary new];
if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy];
if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy];
dispatch_barrier_async(self.barrierQueue, ^{
    [self.callbackBlocks addObject:callbacks];
});
return callbacks;
}

然后再初始化請求务冕,創(chuàng)建SDWebImageDownloaderOperation 對象去請求網(wǎng)絡,而這個SDWebImageDownloaderOperation對象是NSOperation的子類幻赚,需要添加到NSOperationQueue

[sself.downloadQueue addOperation:operation];

在重寫的start方法中禀忆,啟動了NSURLSessionTask臊旭,然后對應的監(jiān)聽NSURLSessionTaskDelegateNSURLSessionDataDelegate代理方法并使用block不斷的回調下載進度,最后在下載完成方法

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 

回調完成SDWebImageDownloaderCompletedBlock箩退,
下載完成后离熏,更新image的同時會將圖片保存到NSCache中,如果需要保存到硬盤戴涝,會先判斷圖片格式滋戳,然后轉成NSData,以URL的MD5作為Key去存儲到對應路徑啥刻。還有一點就是對于文件的管理奸鸯,當退出到后臺時,會檢測清楚過期文件可帽,如果超過了最大緩存娄涩,則會清除較舊的文件直到最大緩存的一半。下圖為各類的方法和內部聯(lián)系蘑拯。


內部結構
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钝满,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子申窘,更是在濱河造成了極大的恐慌弯蚜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剃法,死亡現(xiàn)場離奇詭異碎捺,居然都是意外死亡,警方通過查閱死者的電腦和手機贷洲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門收厨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人优构,你說我怎么就攤上這事诵叁。” “怎么了钦椭?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵拧额,是天一觀的道長。 經(jīng)常有香客問我彪腔,道長侥锦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任德挣,我火速辦了婚禮恭垦,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己番挺,他們只是感情好唠帝,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著建芙,像睡著了一般没隘。 火紅的嫁衣襯著肌膚如雪懂扼。 梳的紋絲不亂的頭發(fā)上禁荸,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音阀湿,去河邊找鬼赶熟。 笑死,一個胖子當著我的面吹牛陷嘴,可吹牛的內容都是我干的映砖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼灾挨,長吁一口氣:“原來是場噩夢啊……” “哼邑退!你這毒婦竟也來了?” 一聲冷哼從身側響起劳澄,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤地技,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秒拔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莫矗,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年砂缩,在試婚紗的時候發(fā)現(xiàn)自己被綠了作谚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡庵芭,死狀恐怖妹懒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情双吆,我是刑警寧澤眨唬,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站伊诵,受9級特大地震影響单绑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜曹宴,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一搂橙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦区转、人聲如沸苔巨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侄泽。三九已至,卻和暖如春蜻韭,著一層夾襖步出監(jiān)牢的瞬間悼尾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工肖方, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闺魏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓俯画,卻偏偏與公主長得像析桥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子艰垂,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容