本文分析的 SDWebImage 版本為4.3.2。可以來這里下載一下源碼注釋
一、為什么會出現SDWebImage?
二、SDWebImage不同版本的區別
三、SDWebImage的使用
四、解讀SDWebImage UML 類圖 和 流程圖
五、詳細的類的解析和該類的流程
- UIView+WebCache、SDWebImageManager
- SDWebImageDownloader
- SDWebImageCache
- SDWebImageDownloaderOperatiion
- 問題總結
一、為什么會出現SDWebImage?
SDWebImage作者 Olivier Poitrey
在SDWebImage 1.0版本的文檔里說,由于用網絡圖片對UITableView缺乏支持用起來很難受,Google一番后也沒有發現有哪個簡單的庫來為您執行異步圖像抓取+緩存工作。
于是他找了他的好朋友Sebastien Flory(Fraggle)尋求幫助,后來他發現用NSOperation類來管理并發,UITableView中圖片的加載響應速度提升很多。因此他重寫了Fraggle的實現。
二、SDWebImage不同版本的區別
2.x
- 將UIImageView類圖像和緩存管理添加到Cocoa Touch框架的類別
- 異步圖片下載器
- 異步內存+磁盤映像緩存,并且自動處理過期的緩存圖片
- 后臺圖像解壓縮
- 保證相同的URL不會被多次下載
- 保證偽造的URL不會一次又一次地重試
- 保證主線程永遠不會被阻塞
3.x
- 將UIImageView類圖像和緩存管理添加到Cocoa Touch框架的類別
- 異步圖片下載器
- 異步內存+磁盤映像緩存,并且自動處理過期的緩存圖片
- 后臺圖像解壓縮
- 保證相同的URL不會被多次下載
- 保證偽造的URL不會一次又一次地重試
- 保證主線程永遠不會被阻塞
新增功能:
- 動畫GIF支持
- WebP格式支持
- 使用GCD和ARC
- Arm64支持
4.x
- 類別UIImageView,UIButton,MKAnnotationView添加Web圖像和高速緩存管理
- 異步圖片下載器
- 異步內存+磁盤映像緩存,并且自動處理過期的緩存圖片
- 后臺圖像解壓縮
- 保證相同的URL不會被多次下載
- 保證偽造的URL不會一次又一次地重試
- 保證主線程永遠不會被阻塞
- 使用GCD和ARC
說明上看起來沒什么區別
從文件上看
新增
- 緩存配置類 SDImageCacheConfig
- 一堆Decoder類 對之前SDWebImageDecoder補充優化
- 圖像變換類 SDWebImageTransition
- category 新增功能調用接口
image.png
image.png
對于GIF圖的展示
- 從4.0版本開始,我們依靠FLAnimatedImage來照顧我們的動畫圖像。
- 要使用它,只需確保你我們FLAnimatedImageView而不是UIImageView。
- 注意:有一個向后兼容的功能,所以如果你還在試圖加載GIF成UIImageView,它只會顯示第一幀為靜態圖像。
- 重要提示:FLAnimatedImage僅適用于iOS平臺,因此對于所有其他平臺(OS X,tvOS,watchOS),我們將回退到上述向后兼容性功能
4.x支持
- iOS 7.0或更高版本
- tvOS 9.0或更高版本
- watchOS 2.0或更高版本
- OS X 10.8或更高版本
- Xcode 7.3或更高版本
向后兼容性
- 對于iOS <7.0,請使用最新的3.x版本 - 當前為3.8.2
- 對于iOS <5.0,請使用最新的2.0版本。
三、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
- 我們便于調用的類別依賴于UIView+WebCache,UIView+WebCache依賴于SDWebImageManager;
- SDWebImageManager 由 SDWebImageManagerDelegate、SDImageCache、SDWebImageDownloader 組成,聚合關系但不是強依賴;
- SDWebImageManager 依賴于 SDWebImageCombinedOperation,SDWebImageCombinedOperation實現了SDWebImageOperation的代理;
- SDImageCache 由 SDImageCacheConfig 組成,依賴 SDWebImageCodersManager;
- SDWebImageDownloader 依賴 SDWebImageDownloaderOperation、SDWebImageDownloadToken、SDWebImageCodersManager;
- SDWebImageCodersManager 由 SDWebImageWebPCoder、SDWebImageImageIOCoder、SDWebImageGIFCoder組成;
- SDWebImageCodersManager、SDWebImageGIFCoder 實現了 SDWebImageCoder 的代理,SDWebImageWebPCoder、SDWebImageImageIOCoder 實現了 SDWebImageCoder 的子類 SDWebImageProgressiveCoder 的代理;
- SDWebImageDownloaderOperation 繼承于 NSOperation ,并實現了SDWebImageDownloaderOperationInterface 、SDWebImageOperation的代理;
- SDWebImagePrefetcher 由SDWebImageManager 和 SDWebImagePrefetcherDelegate 組成;
- SDWebImage 聲明了 6個 Delegate。
在文件中的位置:
image.png
流程圖:
image.png
從流程圖上看,
- 通常我們使用 UIImageView+WebCache 里的方法來設置網絡圖片的;
- UIImageView+WebCache 的主要方法是調用 UIView+WebCache 里的方法;
- UIView+WebCache 負責給 UIImageView 設置圖片,
** 通過 SDWebImageManager 加載到圖片,
** 把得到的 image 設置給 UIImageView- SDWebImageManager 溝通 SDImageCache 和 SDWebImageDownloader ,
** 首先通過 SDImageCache 查詢到是否有緩存的圖片;
** 接著如果需要下載,就通過 SDWebImageDownloader 下載圖片;
** 然后如果需要緩存,把圖片緩存給 SDImageCache ;