SDWebImage

* SDWebImage用于加載網(wǎng)絡(luò)圖片數(shù)據(jù),使用方法如下:*

第一步,下載SDWebImage,導(dǎo)入工程.Github托管網(wǎng)址
https://github.com/rs/SDWebImage
第二步,在需要的地方導(dǎo)入頭文件#import "UIImageView+WebCache.h"
第三步夺鲜,調(diào)用sd_setImageWithURL:方法緩存圖片

  1. sd_setImageWithURL:
    //圖片緩存的基本代碼皆尔,就是這么簡(jiǎn)單
    [self.image1 sd_setImageWithURL:imagePath1];

  2. sd_setImageWithURL: completed:
    //用block 可以在圖片加載完成之后做些事情
    [self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

    }];

  3. sd_setImageWithURL: placeholderImage:
    //給一張默認(rèn)圖片,先使用默認(rèn)圖片币励,當(dāng)圖片加載完成后再替換
    [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"]];

  4. sd_setImageWithURL: placeholderImage: completed:
    //使用默認(rèn)圖片慷蠕,而且用block 在完成后做一些事情
    [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

    }];

  5. sd_setImageWithURL: placeholderImage: options:
    //options 選擇方式

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

除了帶options選項(xiàng)的方法,其他的方法都是綜合存儲(chǔ)食呻,也就是內(nèi)存緩存和磁盤(pán)緩存結(jié)合的方式流炕,如果你只需要內(nèi)存緩存澎现,那么在options這里選擇SDWebImageCacheMemoryOnly就可以了。(磁盤(pán)手動(dòng)釋放,內(nèi)存系統(tǒng)釋放)

 //UI交互期間開(kāi)始下載每辟,導(dǎo)致延遲下載比如UIScrollView減速昔头。
 SDWebImageLowPriority = 1 << 1,
  
 //只進(jìn)行內(nèi)存緩存
 SDWebImageCacheMemoryOnly = 1 << 2, 
  //失敗后重試
 SDWebImageRetryFailed = 1 << 0,
 //這個(gè)標(biāo)志可以漸進(jìn)式下載,顯示的圖像是逐步在下載
 SDWebImageProgressiveDownload = 1 << 3,
  
 //刷新緩存
 SDWebImageRefreshCached = 1 << 4,
  
 //后臺(tái)下載
 SDWebImageContinueInBackground = 1 << 5,
  
 //NSMutableURLRequest.HTTPShouldHandleCookies = YES;
  
 SDWebImageHandleCookies = 1 << 6,
  
 //允許使用無(wú)效的SSL證書(shū)
 //SDWebImageAllowInvalidSSLCertificates = 1 << 7,
  
 //優(yōu)先下載
 SDWebImageHighPriority = 1 << 8,
  
 //延遲占位符
 SDWebImageDelayPlaceholder = 1 << 9,
  
 //改變動(dòng)畫(huà)形象
 SDWebImageTransformAnimatedImage = 1 << 10,

二、SDWebImage內(nèi)部實(shí)現(xiàn)過(guò)程

入口 setImageWithURL:placeholderImage:options: 會(huì)先把 placeholderImage 顯示影兽,然后 SDWebImageManager 根據(jù) URL 開(kāi)始處理圖片。

進(jìn)入 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)存緩存中沒(méi)有,生成 NSInvocationOperation 添加到隊(duì)列開(kāi)始從硬盤(pán)查找圖片是否已經(jīng)緩存闹击。

根據(jù) URLKey 在硬盤(pán)緩存目錄下嘗試讀取圖片文件镶蹋。這一步是在 NSOperation 進(jìn)行的操作,所以回主線(xiàn)程進(jìn)行結(jié)果回調(diào) notifyDelegate:赏半。

如果上一操作從硬盤(pán)讀取到了圖片贺归,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過(guò)小,會(huì)先清空內(nèi)存緩存)断箫。SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo:拂酣。進(jìn)而回調(diào)展示圖片。

如果從硬盤(pán)緩存目錄讀取不到圖片仲义,說(shuō)明所有緩存都不存在該圖片婶熬,需要下載圖片,回調(diào) imageCache:didNotFindImageForKey:userInfo:埃撵。

共享或重新生成一個(gè)下載器 SDWebImageDownloader 開(kāi)始下載圖片赵颅。

圖片下載由 NSURLConnection 來(lái)做,實(shí)現(xiàn)相關(guān) delegate 來(lái)判斷圖片下載中暂刘、下載完成和下載失敗饺谬。

connection:didReceiveData: 中利用 ImageIO 做了按圖片下載進(jìn)度加載效果。

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

圖片解碼處理在一個(gè) NSOperationQueue 完成商蕴,不會(huì)拖慢主線(xiàn)程 UI。如果有需要對(duì)下載的圖片進(jìn)行二次處理芝发,最好也在這里完成绪商,效率會(huì)好很多。

在主線(xiàn)程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成辅鲸,imageDecoder:didFinishDecodingImage:userInfo:
回調(diào)給SDWebImageDownloader格郁。
imageDownloader:didFinishWithImage:
回調(diào)給 SDWebImageManager 告知圖片下載完成。

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

將圖片保存到 SDImageCache 中锣尉,內(nèi)存緩存和硬盤(pán)緩存同時(shí)保存。寫(xiě)文件到硬盤(pán)也在以單獨(dú) NSInvocationOperation 完成决采,避免拖慢主線(xiàn)程自沧。

SDImageCache 在初始化的時(shí)候會(huì)注冊(cè)一些消息通知,在內(nèi)存警告或退到后臺(tái)的時(shí)候清理內(nèi)存圖片緩存树瞭,應(yīng)用結(jié)束的時(shí)候清理過(guò)期圖片拇厢。

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

SDWebImagePrefetcher 可以預(yù)先下載圖片孝偎,方便后續(xù)使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凉敲,一起剝皮案震驚了整個(gè)濱河市衣盾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爷抓,老刑警劉巖势决,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異废赞,居然都是意外死亡徽龟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)唉地,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)据悔,“玉大人,你說(shuō)我怎么就攤上這事耘沼〖牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵群嗤,是天一觀的道長(zhǎng)菠隆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)狂秘,這世上最難降的妖魔是什么骇径? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮者春,結(jié)果婚禮上破衔,老公的妹妹穿的比我還像新娘。我一直安慰自己钱烟,他們只是感情好晰筛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布嫡丙。 她就那樣靜靜地躺著,像睡著了一般读第。 火紅的嫁衣襯著肌膚如雪曙博。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天怜瞒,我揣著相機(jī)與錄音父泳,去河邊找鬼。 笑死吴汪,一個(gè)胖子當(dāng)著我的面吹牛尘吗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浇坐,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黔宛!你這毒婦竟也來(lái)了近刘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤臀晃,失蹤者是張志新(化名)和其女友劉穎觉渴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體徽惋,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡案淋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了险绘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踢京。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宦棺,靈堂內(nèi)的尸體忽然破棺而出瓣距,到底是詐尸還是另有隱情,我是刑警寧澤代咸,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布蹈丸,位于F島的核電站,受9級(jí)特大地震影響呐芥,放射性物質(zhì)發(fā)生泄漏逻杖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一思瘟、第九天 我趴在偏房一處隱蔽的房頂上張望荸百。 院中可真熱鬧,春花似錦潮太、人聲如沸管搪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)更鲁。三九已至霎箍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澡为,已是汗流浹背漂坏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媒至,地道東北人顶别。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拒啰,于是被迫代替她去往敵國(guó)和親驯绎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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