OC常用第三方庫SDWebImage原理

在iOS編程中SDWebImage這個開源的第三方庫基本上每位開發(fā)者都使用過,我們從使用方法入手,去思考他的內(nèi)部實現(xiàn)压昼。

使用部分

第一步,下載SDWebImage瘤运,導(dǎo)入工程窍霞。github托管地址https://github.com/rs/SDWebImage

第二步,在需要的地方導(dǎo)入頭文件
#import "UIImageView+WebCache.h"
第三步拯坟,調(diào)用sd_setImageWithURL:方法緩存圖片但金,注意,這就是新版本的新方法郁季,舊方法是setImageWithURL:冷溃。下面將幾個方法都介紹一下。

  1. sd_setImageWithURL:
    //圖片緩存的基本代碼梦裂,就是這么簡單
    [self.image1 sd_setImageWithURL:imagePath1];
  1. sd_setImageWithURL: completed:
   [self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        NSLog(@"這里可以在圖片加載完成之后做些事情");
    }];
  1. sd_setImageWithURL: placeholderImage:
   [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"]];
  1. sd_setImageWithURL: placeholderImage: completed:
    [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        NSLog(@"圖片加載完成后做的事情")似枕;
    }];
  1. sd_setImageWithURL: placeholderImage: options:
     [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageRetryFailed];

OC是自文檔語言,看方法名就知道干什么的了年柠。除了帶options選項的方法凿歼,其他的方法都是綜合存儲,也就是內(nèi)存緩存和磁盤緩存結(jié)合的方式冗恨,如果你只需要內(nèi)存緩存答憔,那么在options這里選擇SDWebImageCacheMemoryOnly就可以了。

option的意義以及內(nèi)部實現(xiàn)的流程


     SDWebImageRetryFailed = 1 << 0,

      

     //UI交互期間開始下載掀抹,導(dǎo)致延遲下載比如UIScrollView減速虐拓。

     SDWebImageLowPriority = 1 << 1,

      

     //只進行內(nèi)存緩存

     SDWebImageCacheMemoryOnly = 1 << 2,

      

     //這個標志可以漸進式下載,顯示的圖像是逐步在下載

     SDWebImageProgressiveDownload = 1 << 3,

      

     //刷新緩存

     SDWebImageRefreshCached = 1 << 4,

      

     //后臺下載

     SDWebImageContinueInBackground = 1 << 5,

      

     //NSMutableURLRequest.HTTPShouldHandleCookies = YES;

      

     SDWebImageHandleCookies = 1 << 6,

      

     //允許使用無效的SSL證書

     //SDWebImageAllowInvalidSSLCertificates = 1 << 7,

      

     //優(yōu)先下載

     SDWebImageHighPriority = 1 << 8,

      

     //延遲占位符

     SDWebImageDelayPlaceholder = 1 << 9,

      

     //改變動畫形象

     SDWebImageTransformAnimatedImage = 1 << 10,

內(nèi)部實現(xiàn)

1.入口 setImageWithURL:placeholderImage:options: 會先把 placeholderImage 顯示,然后 SDWebImageManager 根據(jù) URL 開始處理圖片渴丸。

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

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

4.SDWebImageManagerDelegate 回調(diào) webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示圖片吠谢。

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

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

7.如果上一操作從硬盤讀取到了圖片王污,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過小,會先清空內(nèi)存緩存)楚午。SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo:昭齐。進而回調(diào)展示圖片。

8.如果從硬盤緩存目錄讀取不到圖片矾柜,說明所有緩存都不存在該圖片阱驾,需要下載圖片,回調(diào) imageCache:didNotFindImageForKey:userInfo:怪蔑。

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

10.圖片下載由 NSURLConnection 來做,實現(xiàn)相關(guān) delegate 來判斷圖片下載中缆瓣、下載完成和下載失敗喧枷。

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

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

13.圖片解碼處理在一個 NSOperationQueue 完成隧甚,不會拖慢主線程 UI。如果有需要對下載的圖片進行二次處理昼丑,最好也在這里完成呻逆,效率會好很多夸赫。

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

15.imageDownloader:didFinishWithImage: 回調(diào)給 SDWebImageManager 告知圖片下載完成茬腿。

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

17.將圖片保存到 SDImageCache 中切平,內(nèi)存緩存和硬盤緩存同時保存握础。寫文件到硬盤也在以單獨 NSInvocationOperation 完成,避免拖慢主線程悴品。

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

19.SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache定枷,方便使用孤澎。

20.SDWebImagePrefetcher 可以預(yù)先下載圖片,方便后續(xù)使用欠窒。

//覆蓋方法覆旭,指哪打哪,這個方法是下載imagePath2的時候響應(yīng)

SDWebImageManager *manager = [SDWebImageManager sharedManager];

 

[manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {

     

    NSLog(@"顯示當前進度");

     

} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {

     

    NSLog(@"下載完成");

}];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岖妄,一起剝皮案震驚了整個濱河市型将,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荐虐,老刑警劉巖七兜,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異福扬,居然都是意外死亡惊搏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門忧换,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恬惯,“玉大人,你說我怎么就攤上這事亚茬±叶” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵刹缝,是天一觀的道長碗暗。 經(jīng)常有香客問我,道長梢夯,這世上最難降的妖魔是什么言疗? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮颂砸,結(jié)果婚禮上噪奄,老公的妹妹穿的比我還像新娘。我一直安慰自己人乓,他們只是感情好勤篮,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著色罚,像睡著了一般碰缔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戳护,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天金抡,我揣著相機與錄音瀑焦,去河邊找鬼。 笑死梗肝,一個胖子當著我的面吹牛蝠猬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播统捶,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼榆芦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喘鸟?” 一聲冷哼從身側(cè)響起匆绣,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎什黑,沒想到半個月后崎淳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡愕把,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年拣凹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恨豁。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚣镜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橘蜜,到底是詐尸還是另有隱情菊匿,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布计福,位于F島的核電站跌捆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏象颖。R本人自食惡果不足惜佩厚,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望说订。 院中可真熱鬧抄瓦,春花似錦、人聲如沸克蚂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽埃叭。三九已至,卻和暖如春悉罕,著一層夾襖步出監(jiān)牢的瞬間赤屋,已是汗流浹背立镶。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留类早,地道東北人媚媒。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像涩僻,于是被迫代替她去往敵國和親缭召。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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

  • 最近一部馬伊琍主演的電視劇非常火爆室抽,閑來無事的我在眾多推送中選擇了這部多位實力派演員陣容的劇來看搪哪,竟然看的百感交集...
    小菲菲菲菲菲菲兒閱讀 508評論 5 4
  • 大年初四晓折,在外工作的已經(jīng)開始踏上了歸程。做為我們生意人兽泄,今天也接了好幾個電話和信息漓概,問開工了沒有?我這需要補貨了病梢。...
    展嘉閱讀 207評論 0 1
  • 編輯:淺紫小妖32 兩個為生活奔波的男人垛耳,兩張坐椅、兩瓶飲料飘千、兩種截然不同的職業(yè)和人生堂鲜;一樣的心情,一樣的體會护奈,把...
    言午許墨閱讀 328評論 0 0