SDWebImage 4.x版本源碼分析(一)圖解?。?!

本文分析的 SDWebImage 版本為4.3.2??梢詠磉@里下載一下源碼注釋

一、為什么會出現(xiàn)SDWebImage?
二、SDWebImage不同版本的區(qū)別
三、SDWebImage的使用
四、解讀SDWebImage UML 類圖 和 流程圖
五、詳細的類的解析和該類的流程
- UIView+WebCache、SDWebImageManager
- SDWebImageDownloader
- SDWebImageCache
- SDWebImageDownloaderOperatiion
- 問題總結(jié)


一、為什么會出現(xiàn)SDWebImage?

SDWebImage作者 Olivier Poitrey

在SDWebImage 1.0版本的文檔里說,由于用網(wǎng)絡(luò)圖片對UITableView缺乏支持用起來很難受,Google一番后也沒有發(fā)現(xiàn)有哪個簡單的庫來為您執(zhí)行異步圖像抓取+緩存工作。

于是他找了他的好朋友Sebastien Flory(Fraggle)尋求幫助,后來他發(fā)現(xiàn)用NSOperation類來管理并發(fā),UITableView中圖片的加載響應(yīng)速度提升很多。因此他重寫了Fraggle的實現(xiàn)。

二、SDWebImage不同版本的區(qū)別

2.x

  • 將UIImageView類圖像和緩存管理添加到Cocoa Touch框架的類別
  • 異步圖片下載器
  • 異步內(nèi)存+磁盤映像緩存,并且自動處理過期的緩存圖片
  • 后臺圖像解壓縮
  • 保證相同的URL不會被多次下載
  • 保證偽造的URL不會一次又一次地重試
  • 保證主線程永遠不會被阻塞

3.x

  • 將UIImageView類圖像和緩存管理添加到Cocoa Touch框架的類別
  • 異步圖片下載器
  • 異步內(nèi)存+磁盤映像緩存,并且自動處理過期的緩存圖片
  • 后臺圖像解壓縮
  • 保證相同的URL不會被多次下載
  • 保證偽造的URL不會一次又一次地重試
  • 保證主線程永遠不會被阻塞

新增功能:

  • 動畫GIF支持
  • WebP格式支持
  • 使用GCD和ARC
  • Arm64支持

4.x

  • 類別UIImageView,UIButton,MKAnnotationView添加Web圖像和高速緩存管理
  • 異步圖片下載器
  • 異步內(nèi)存+磁盤映像緩存,并且自動處理過期的緩存圖片
  • 后臺圖像解壓縮
  • 保證相同的URL不會被多次下載
  • 保證偽造的URL不會一次又一次地重試
  • 保證主線程永遠不會被阻塞
  • 使用GCD和ARC

說明上看起來沒什么區(qū)別

從文件上看
新增

  • 緩存配置類 SDImageCacheConfig
  • 一堆Decoder類 對之前SDWebImageDecoder補充優(yōu)化
  • 圖像變換類 SDWebImageTransition
  • category 新增功能調(diào)用接口
image.png
image.png

對于GIF圖的展示

  • 從4.0版本開始,我們依靠FLAnimatedImage來照顧我們的動畫圖像。
  • 要使用它,只需確保你我們FLAnimatedImageView而不是UIImageView。
  • 注意:有一個向后兼容的功能,所以如果你還在試圖加載GIF成UIImageView,它只會顯示第一幀為靜態(tài)圖像。
  • 重要提示:FLAnimatedImage僅適用于iOS平臺,因此對于所有其他平臺(OS X,tvOS,watchOS),我們將回退到上述向后兼容性功能

4.x支持

  • iOS 7.0或更高版本
  • tvOS 9.0或更高版本
  • watchOS 2.0或更高版本
  • OS X 10.8或更高版本
  • Xcode 7.3或更高版本

向后兼容性

三、SDWebImage的使用

安裝方法

// 必須
pod ‘SDWebImage'
// 可選 使用GIF
pod 'SDWebImage/GIF’
// 可選 使用WebP
pod 'SDWebImage/WebP’

使用

#import <SDWebImage/UIImageView+WebCache.h>

...

[imageView sd_setImageWithURL:[NSURL URLWithString:@"[http://www.domain.com/path/to/image.jpg](http://www.domain.com/path/to/image.jpg)"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

四、解讀SDWebImage UML 類圖 和 流程圖

首先看一下UML圖

image.png
image.png
  1. 我們便于調(diào)用的類別依賴于UIView+WebCache,UIView+WebCache依賴于SDWebImageManager;
  2. SDWebImageManager 由 SDWebImageManagerDelegate、SDImageCache、SDWebImageDownloader 組成,聚合關(guān)系但不是強依賴;
  3. SDWebImageManager 依賴于 SDWebImageCombinedOperation,SDWebImageCombinedOperation實現(xiàn)了SDWebImageOperation的代理;
  4. SDImageCache 由 SDImageCacheConfig 組成,依賴 SDWebImageCodersManager;
  5. SDWebImageDownloader 依賴 SDWebImageDownloaderOperation、SDWebImageDownloadToken、SDWebImageCodersManager;
  6. SDWebImageCodersManager 由 SDWebImageWebPCoder、SDWebImageImageIOCoder、SDWebImageGIFCoder組成;
  7. SDWebImageCodersManager、SDWebImageGIFCoder 實現(xiàn)了 SDWebImageCoder 的代理,SDWebImageWebPCoder、SDWebImageImageIOCoder 實現(xiàn)了 SDWebImageCoder 的子類 SDWebImageProgressiveCoder 的代理;
  8. SDWebImageDownloaderOperation 繼承于 NSOperation ,并實現(xiàn)了SDWebImageDownloaderOperationInterface 、SDWebImageOperation的代理;
  9. SDWebImagePrefetcher 由SDWebImageManager 和 SDWebImagePrefetcherDelegate 組成;
  10. SDWebImage 聲明了 6個 Delegate。

在文件中的位置:


image.png

流程圖:


image.png

從流程圖上看,

  1. 通常我們使用 UIImageView+WebCache 里的方法來設(shè)置網(wǎng)絡(luò)圖片的;
  2. UIImageView+WebCache 的主要方法是調(diào)用 UIView+WebCache 里的方法;
  3. UIView+WebCache 負責給 UIImageView 設(shè)置圖片,
    ** 通過 SDWebImageManager 加載到圖片,
    ** 把得到的 image 設(shè)置給 UIImageView
  4. SDWebImageManager 溝通 SDImageCache 和 SDWebImageDownloader ,
    ** 首先通過 SDImageCache 查詢到是否有緩存的圖片;
    ** 接著如果需要下載,就通過 SDWebImageDownloader 下載圖片;
    ** 然后如果需要緩存,把圖片緩存給 SDImageCache ;

下一章,五、詳細的類的解析和該類的流程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容