SDWebImage學習

在iOS的請求網(wǎng)絡圖片框架中亿乳, [**SDWebImage**](https://github.com/rs/SDWebImage) 可謂是占據(jù)大半壁江山途事。它支持從網(wǎng)絡中下載且緩存圖片后室,并設置圖片到對應的UIImageView控件或者UIButton控件躯护。如在我們熟悉的UITableView中經常使用到:```/** * Integrates SDWebImage async downloading and caching of remote images with UIImageView. * * Usage with a UITableViewCell sub-class: * * @code#import...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *MyIdentifier = @"MyIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];

}

// Here we use the provided sd_setImageWithURL: method to load the web image

// Ensure you use a placeholder image otherwise cells will be initialized with no image

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://example.com/image.jpg"]

placeholderImage:[UIImage imageNamed:@"placeholder"]];

cell.textLabel.text = @"My Text";

return cell;

}

* @endcode

*/

```

這樣簡單方便地在項目中使用SDWebImage來管理圖片加載相關操作本股,可以極大地提高開發(fā)效率攀痊,讓我們更加專注于業(yè)務邏輯實現(xiàn)。趁最近項目不忙拄显,我閑下來研究其實現(xiàn)的過程苟径,多讀源碼,更有助于提高自己的編碼水平吧躬审。

SDWebImage 流程

![SDWebImage流程圖.png](http://upload-images.jianshu.io/upload_images/1377007-c7e278abad7ecfed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

以上是SDWebImage實現(xiàn)流程棘街,具體我們從以上實例來解析:

1.入口setImageWithURL:placeholderImage:options:

![UIImageView設置圖片.png](http://upload-images.jianshu.io/upload_images/1377007-d02678b87a71b600.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

會先把 placeholderImage 顯示,然后 SDWebImageManager 根據(jù) URL 開始處理圖片承边。這里值得注意的是蹬碧,開始加載之前圖片先取消對應的UIImageView先前的圖片下載操作。試想炒刁,如果我們給UIImageView設置了一張新的圖片恩沽,那么我們還會在意該UIImageVIew先前是要加載哪一張圖片么?應該是不在意的吧翔始!那是不是應該嘗試把該UIImageView先前的加載圖片相關操作給取消掉呢罗心。

```

[self sd_cancelCurrentImageLoad];

```

2.執(zhí)行到SDWebImageManagerdownloadWithURL:delegate:options:userInfo:,會先根據(jù)給定的URL生成一個唯一的Key,之后利用這個key到緩存中查找對應的圖片緩存城瞎。若內存緩存中沒有渤闷,則讀取磁盤緩存,如果存在磁盤緩存脖镀,那么將磁盤緩存讀到內存中成為內存緩存飒箭。如果都磁盤緩存也沒有的話,那么就在執(zhí)行的doneBlock中開始下載圖片蜒灰。

![讀取緩存圖片.png](http://upload-images.jianshu.io/upload_images/1377007-d4610de3361977e3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![下載圖片操作.png](http://upload-images.jianshu.io/upload_images/1377007-2fba7eec2d43a525.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

3.圖片下載由 NSURLConnection 來做弦蹂,實現(xiàn)相關 delegate 來判斷圖片下載中、下載完成和下載失敗强窖。

![設置NSURLConnection對象.png](http://upload-images.jianshu.io/upload_images/1377007-7fb8d287228d59c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)![NSURLConnection對象實現(xiàn)代理.png](http://upload-images.jianshu.io/upload_images/1377007-023395e911b024af.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

4.connectionDidFinishLoading: 數(shù)據(jù)下載完成后交給 SDWebImageDecoder 做圖片解碼處理凸椿。

5.圖片解碼處理在一個 NSOperationQueue 完成,

不會拖慢主線程 UI翅溺。

6.在主線程 notifyDelegateOnMainThreadWithInfo:

宣告解碼完成脑漫,

imageDecoder:didFinishDecodingImage:userInfo:

回調給 SDWebImageDownloader髓抑。就不一一截圖了。

7.imageDownloader:didFinishWithImage:

回調給 SDWebImageManager 告知圖片下載完成优幸。

8.通知所有的 downloadDelegates 下載完成吨拍,

回調給需要的地方展示圖片。

9.將圖片保存到 SDImageCache 中网杆,

內存緩存和硬盤緩存同時保存撼玄。

寫文件到硬盤也在以單獨 NSInvocationOperation 完成陨闹,

避免拖慢主線程奴饮。

10.SDImageCache 在初始化的時候會注冊一些消息通知歇拆,

在內存警告或退到后臺的時候清理內存圖片緩存新啼,

應用結束的時候清理過期圖片追城。

11.SDWI 也提供了 UIButton+WebCache 和

MKAnnotationView+WebCache,方便使用燥撞。

22.SDWebImagePrefetcher 可以預先下載圖片座柱,

方便后續(xù)使用。

總結

SDWebImage作為一個優(yōu)秀的圖片加載框架物舒,提供的使用方法和接口對開發(fā)者來說非常友好色洞。其內部實現(xiàn)多是采用Block的方式來實現(xiàn)回調,代碼閱讀起來可能沒有那么直觀冠胯。本人能力有限火诸,文章中難免有錯誤以及認識不到位的地方,若大家在閱讀過程中有發(fā)現(xiàn)不合理或者錯誤的地方懇請在評論中指出荠察,我會在第一時間進行修正,不勝感激置蜀。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末悉盆,一起剝皮案震驚了整個濱河市盯荤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焕盟,老刑警劉巖秋秤,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脚翘,居然都是意外死亡灼卢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門来农,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芥玉,“玉大人,你說我怎么就攤上這事备图〔忧桑” “怎么了赶袄?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抠藕。 經常有香客問我饿肺,道長,這世上最難降的妖魔是什么盾似? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任敬辣,我火速辦了婚禮,結果婚禮上零院,老公的妹妹穿的比我還像新娘溉跃。我一直安慰自己,他們只是感情好告抄,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布撰茎。 她就那樣靜靜地躺著,像睡著了一般打洼。 火紅的嫁衣襯著肌膚如雪龄糊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天募疮,我揣著相機與錄音炫惩,去河邊找鬼。 笑死阿浓,一個胖子當著我的面吹牛他嚷,可吹牛的內容都是我干的。 我是一名探鬼主播芭毙,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼爸舒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稿蹲?” 一聲冷哼從身側響起扭勉,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苛聘,沒想到半個月后涂炎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡设哗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年唱捣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片网梢。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡震缭,死狀恐怖,靈堂內的尸體忽然破棺而出战虏,到底是詐尸還是另有隱情拣宰,我是刑警寧澤党涕,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站巡社,受9級特大地震影響膛堤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜晌该,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一肥荔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朝群,春花似錦燕耿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谭期,卻和暖如春堵第,著一層夾襖步出監(jiān)牢的瞬間吧凉,已是汗流浹背隧出。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阀捅,地道東北人胀瞪。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像饲鄙,于是被迫代替她去往敵國和親凄诞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容