SDWebImage 里的語法說明

上一遍博客我們提到了 SDWebImage 的一些使用,這篇我們來講解一下具體運用時的語法


SDWebImage 提供一個UIImageView類別以支持加載來自網(wǎng)絡(luò)的遠程圖片密任。具有緩存管理、異步下載、同一個URL下載次數(shù)控制和優(yōu)化等特征啥刻。

SDWebImage 支持異步的圖片下載+緩存掌实,提供了 UIImageView+WebCacha 的 category,方便使用。紀錄一下 SDWebImage 加載圖片的流程栓撞。


1. sd_setImageWithURL:

[self.image1 sd_setImageWithURL:imagePath1];

2. sd_setImageWithURL:? completed:

//用block 可以在圖片加載完成之后做些事情

[self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

NSLog(@"這里可以在圖片加載完成之后做些事情");

}];

3. sd_setImageWithURL:? placeholderImage:

//給一張默認圖片纪隙,先使用默認圖片赊豌,當圖片加載完成后再替換

[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"abc.jpeg"]];

4. sd_setImageWithURL:? placeholderImage:? completed:

//使用默認圖片,而且用block 在完成后做一些事情

[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"abc.jpeg"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

NSLog(@"圖片加載完成后做的事情");

}];

5. sd_setImageWithURL:? placeholderImage:? options:

//options 選擇方式

[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"abc.jpeg"] options:SDWebImageRetryFailed];



下面我們來看一下 ?SDWebImage 內(nèi)部的實現(xiàn)過程

入口 setImageWithURL:placeholderImage:options: 會先把 placeholderImage 顯示绵咱,然后 SDWebImageManager 根據(jù) URL 開始處理圖片碘饼。

進入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給 SDImageCache 從緩存查找圖片是否已經(jīng)下載 queryDiskCacheForKey:delegate:userInfo:.

先從內(nèi)存圖片緩存查找是否有圖片悲伶,如果內(nèi)存中已經(jīng)有圖片緩存艾恼,SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。

SDWebImageManagerDelegate 回調(diào) webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示圖片拢切。

如果內(nèi)存緩存中沒有蒂萎,生成 NSInvocationOperation 添加到隊列開始從硬盤查找圖片是否已經(jīng)緩存。

根據(jù) URLKey 在硬盤緩存目錄下嘗試讀取圖片文件淮椰。這一步是在 NSOperation 進行的操作五慈,所以回主線程進行結(jié)果回調(diào) notifyDelegate:。

如果上一操作從硬盤讀取到了圖片主穗,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過小泻拦,會先清空內(nèi)存緩存)。SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo:忽媒。進而回調(diào)展示圖片争拐。

如果從硬盤緩存目錄讀取不到圖片,說明所有緩存都不存在該圖片晦雨,需要下載圖片架曹,回調(diào) imageCache:didNotFindImageForKey:userInfo:隘冲。

共享或重新生成一個下載器 SDWebImageDownloader 開始下載圖片。

圖片下載由 NSURLConnection 來做绑雄,實現(xiàn)相關(guān) delegate 來判斷圖片下載中展辞、下載完成和下載失敗。

connection:didReceiveData: 中利用 ImageIO 做了按圖片下載進度加載效果万牺。

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

圖片解碼處理在一個 NSOperationQueue 完成,不會拖慢主線程 UI脚粟。如果有需要對下載的圖片進行二次處理覆旱,最好也在這里完成,效率會好很多核无。

在主線程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成扣唱,imageDecoder:didFinishDecodingImage:userInfo: 回調(diào)給 SDWebImageDownloader。

imageDownloader:didFinishWithImage: 回調(diào)給 SDWebImageManager 告知圖片下載完成厕宗。

通知所有的 downloadDelegates 下載完成画舌,回調(diào)給需要的地方展示圖片。

將圖片保存到 SDImageCache 中已慢,內(nèi)存緩存和硬盤緩存同時保存曲聂。寫文件到硬盤也在以單獨 NSInvocationOperation 完成,避免拖慢主線程佑惠。

SDImageCache 在初始化的時候會注冊一些消息通知朋腋,在內(nèi)存警告或退到后臺的時候清理內(nèi)存圖片緩存,應(yīng)用結(jié)束的時候清理過期圖片膜楷。

SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache旭咽,方便使用。

SDWebImagePrefetcher 可以預(yù)先下載圖片赌厅,方便后續(xù)使用穷绵。




獨立的異步圖像下載

可能會單獨用到異步圖片下載,則一定要用downloaderWithURL:delegate:來建立一個SDWebImageDownloader實例特愿。

downloader = [SDWebImageDownloader downloaderWithURL:url delegate:self];

這樣SDWebImageDownloaderDelegate協(xié)議的方法imageDownloader:didFinishWithImage:被調(diào)用時下載會立即開始并完成仲墨。

獨立的異步圖像緩存

SDImageCache類提供一個創(chuàng)建空緩存的實例,并用方法imageForKey:來尋找當前緩存揍障。

UIImage *myCachedImage = [[SDImageCache sharedImageCache] imageFromKey:myCacheKey];

存儲一個圖像到緩存是使用方法storeImage: forKey:

[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];

默認情況下目养,圖像將被存儲在內(nèi)存緩存和磁盤緩存中。如果僅僅是想內(nèi)存緩存中毒嫡,要使用storeImage:forKey:toDisk:方法的第三個參數(shù)帶一負值

來替代癌蚁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子努释,更是在濱河造成了極大的恐慌碘梢,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伐蒂,死亡現(xiàn)場離奇詭異痘系,居然都是意外死亡,警方通過查閱死者的電腦和手機饿自,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龄坪,“玉大人昭雌,你說我怎么就攤上這事〗√铮” “怎么了烛卧?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妓局。 經(jīng)常有香客問我总放,道長,這世上最難降的妖魔是什么好爬? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任局雄,我火速辦了婚禮,結(jié)果婚禮上存炮,老公的妹妹穿的比我還像新娘炬搭。我一直安慰自己,他們只是感情好穆桂,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布宫盔。 她就那樣靜靜地躺著,像睡著了一般享完。 火紅的嫁衣襯著肌膚如雪灼芭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天般又,我揣著相機與錄音彼绷,去河邊找鬼。 笑死倒源,一個胖子當著我的面吹牛苛预,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笋熬,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼热某,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昔馋,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤筹吐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秘遏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丘薛,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年邦危,在試婚紗的時候發(fā)現(xiàn)自己被綠了洋侨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡倦蚪,死狀恐怖希坚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陵且,我是刑警寧澤裁僧,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站慕购,受9級特大地震影響聊疲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沪悲,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一获洲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧可训,春花似錦昌妹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谨胞,卻和暖如春固歪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胯努。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工牢裳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叶沛。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓蒲讯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灰署。 傳聞我的和親對象是個殘疾皇子判帮,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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