SDWebImage Note

這是筆者學(xué)習(xí) SDWebImage 源碼時(shí)的筆記南用,對它有著很深的怨念呢萨赁。??

功能

SDWebImage 提供的主要功能如下:

  • 提供異步圖片(后臺(tái))下載并保證不阻塞主線程鞭呕;
  • 支持內(nèi)存和磁盤雙緩存策略文捶,保證同一 url 不會(huì)請求多次吱瘩;
  • 支持 WebP/Gif 等格式道伟;

結(jié)構(gòu)

SDWebImageManager 協(xié)調(diào) SDImageCacheSDWebImageDownloader 這兩個(gè)模塊的工作,內(nèi)部使用自定義的 SDWebImageCombinedOperation 直接或間接引用對圖片的緩存查詢以及下載的操作使碾,便于取消蜜徽。

sdwebimg_struct.png

原理

對于每一次的圖片下載操作,imageManager 讓 cacheManager 去緩存中查找票摇,由于在內(nèi)存緩存中查找的速度很快拘鞋,所以只在對磁盤緩存查詢時(shí),才異步在 ioQueue 中執(zhí)行查詢?nèi)蝿?wù)矢门,避免阻塞主線程盆色。查詢完成之后,imageDownloader 開始工作祟剔,如果 “所需緩存不存在/緩存過期/ SDWebImageRefreshCached 開啟”隔躲,downloader 就會(huì)產(chǎn)生一個(gè) loaderOperation(繼承于 NSOperation)放入 downloadQueue,等待啟動(dòng)峡扩。一旦操作啟動(dòng)蹭越, urlConnection 去下載圖片數(shù)據(jù)。這個(gè)操作是在子線程去執(zhí)行的教届,為了能保證接收到 urlConnection 回調(diào)回來的數(shù)據(jù)响鹃,不能讓這個(gè)線程把 -start 內(nèi)的的代碼執(zhí)行完驾霜,就結(jié)束自己的生命,所以需要 runLoop 去驅(qū)動(dòng)線程接收數(shù)據(jù)买置,直到 “數(shù)據(jù)接收完成/發(fā)生錯(cuò)誤/主動(dòng)取消操作” 才停止這個(gè)runLoop粪糙,接收完成了之后發(fā)送通知并執(zhí)行預(yù)設(shè)的 block。

性能

SDWebImage 的源碼中有兩個(gè)地方提到 ‘performance’ 這個(gè)詞:

  • shouldDecompressImages 這個(gè) flag 中的注釋忿项,提到了如果開啟了這個(gè) flag 可以提高性能蓉冈,換來的代價(jià)是消耗更多的內(nèi)存。要弄懂 shouldDecompressImages 的意義必須先了解圖片從讀取到顯示的過程

      1. 從磁盤拷貝數(shù)據(jù)到內(nèi)核緩沖區(qū)
      2. 從內(nèi)核緩沖區(qū)復(fù)制數(shù)據(jù)到用戶空間
      3. 生成 UIImageView轩触,把圖像數(shù)據(jù)賦值給 UIImageView
      4. 如果圖像數(shù)據(jù)為未解碼的 PNG/JPG寞酿,解碼為位圖數(shù)據(jù)
      5. CATransaction 捕獲到 UIImageView layer 樹的變化
      6. 主線程 Runloop 提交 CATransaction,開始進(jìn)行圖像渲染
          6.1 如果數(shù)據(jù)沒有字節(jié)對齊脱柱,Core Animation 會(huì)再拷貝一份數(shù)據(jù)伐弹,進(jìn)行字節(jié)對齊
          6.2 GPU處理位圖數(shù)據(jù),進(jìn)行渲染
    

在這個(gè)過程中我們可以看到榨为,如果我們直接將未經(jīng)解碼的圖像數(shù)據(jù)傳遞給 UIImageView 對象惨好,那么該對象就會(huì)在主線程中去解碼圖像數(shù)據(jù),在圖片特別大的情況下耗時(shí)相應(yīng)的也會(huì)特別多随闺,因此 SDWebImage 在解碼圖片這一步上做了優(yōu)化日川,放到了子線程中執(zhí)行,這樣拖動(dòng) tableView 的時(shí)候不至于阻塞主線程矩乐。

  • SDWebImageRefreshCached 這個(gè) flag 中的注釋提到龄句,使用 NSURLCache 而非 SDWebImageCache 會(huì)降低一點(diǎn)性能。因?yàn)閷τ诿總€(gè) HTTP 請求绰精,我們都可以對 NSURLCache(如果使用)設(shè)置相應(yīng)的緩存策略撒璧。通常在響應(yīng)返回之后,客戶端緩存這一份數(shù)據(jù)笨使,通過響應(yīng)頭的 Expires, Cache-Control 等字段決定這份緩存什么時(shí)候過期卿樱。如果緩存過期,HTTP 允許緩存端發(fā)送條件 GET 請求到服務(wù)器硫椰,詢問這份緩存的內(nèi)容是否仍然是“新鮮的”繁调。如果服務(wù)器對原來客戶端緩存過的數(shù)據(jù)進(jìn)行了更改,那我們就有必要從服務(wù)器中再取一份數(shù)據(jù)靶草。綜上蹄胰,如果某個(gè) url 對應(yīng)的資源時(shí)常發(fā)生變動(dòng),那么我們應(yīng)該啟用 NSURLCache奕翔,而圖片通常是靜態(tài)的裕寨,所以啟用 SDWebImageCache 可以跳過詢問緩存是否新鮮這個(gè)步驟,提高一點(diǎn)查詢速度。

總結(jié)

有更好的網(wǎng)絡(luò)圖片加載庫嗎宾袜?當(dāng)然捻艳,據(jù)聞 FastImageCache 和 YYWebImage 做的優(yōu)化似乎更多。

然而現(xiàn)在只能等有空的時(shí)候再膜一番了庆猫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末认轨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子月培,更是在濱河造成了極大的恐慌嘁字,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杉畜,死亡現(xiàn)場離奇詭異纪蜒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寻行,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門霍掺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匾荆,“玉大人拌蜘,你說我怎么就攤上這事⊙览觯” “怎么了简卧?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烤芦。 經(jīng)常有香客問我举娩,道長,這世上最難降的妖魔是什么构罗? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任铜涉,我火速辦了婚禮,結(jié)果婚禮上遂唧,老公的妹妹穿的比我還像新娘芙代。我一直安慰自己,他們只是感情好盖彭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布纹烹。 她就那樣靜靜地躺著,像睡著了一般召边。 火紅的嫁衣襯著肌膚如雪铺呵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天隧熙,我揣著相機(jī)與錄音片挂,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛音念,可吹牛的內(nèi)容都是我干的滋将。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼症昏,長吁一口氣:“原來是場噩夢啊……” “哼随闽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肝谭,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤掘宪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后攘烛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魏滚,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年坟漱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鼠次。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芋齿,死狀恐怖腥寇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情觅捆,我是刑警寧澤赦役,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站栅炒,受9級(jí)特大地震影響掂摔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赢赊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一乙漓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧释移,春花似錦叭披、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锋边,卻和暖如春皱坛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豆巨。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工剩辟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓贩猎,卻偏偏與公主長得像熊户,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子吭服,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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