前言
在 iOS 的圖片加載框架中,SDWebImage 可謂是占據(jù)大半壁江山。它支持從網(wǎng)絡(luò)中下載且緩存圖片,并設(shè)置圖片到對(duì)應(yīng)的 UIImageView 控件或者 UIButton 控件。在項(xiàng)目中使用 SDWebImage 來(lái)管理圖片加載相關(guān)操作可以極大地提高開(kāi)發(fā)效率,讓我們更加專注于業(yè)務(wù)邏輯實(shí)現(xiàn)。
功能
1.提供了一個(gè) UIImageView 的 category(分類)用來(lái)加載網(wǎng)絡(luò)圖片并且對(duì)網(wǎng)絡(luò)圖片的緩存進(jìn)行管理
2.采用異步方式來(lái)下載網(wǎng)絡(luò)圖片
3.異步內(nèi)存+磁盤映像緩存,并且自動(dòng)處理過(guò)期的緩存圖片
4.支持 GIF 動(dòng)畫
5.支持 WebP 格式
6.同一個(gè) URL 的網(wǎng)絡(luò)圖片不會(huì)被重復(fù)下載
7.失效的 URL 不會(huì)被無(wú)限重試
8.耗時(shí)操作都在子線程,確保不會(huì)阻塞主線程
9.支持圖片壓縮跟解碼
10....
文件結(jié)構(gòu)圖

解讀SDWebImage UML 類圖 和 流程圖


我們便于調(diào)用的類別依賴于UIView+WebCache,UIView+WebCache依賴于SDWebImageManager;
SDWebImageManager 由 SDWebImageManagerDelegate、SDImageCache、SDWebImageDownloader 組成,聚合關(guān)系但不是強(qiáng)依賴;
SDWebImageManager 依賴于 SDWebImageCombinedOperation,SDWebImageCombinedOperation實(shí)現(xiàn)了SDWebImageOperation的代理;
SDImageCache 由 SDImageCacheConfig 組成,依賴 SDWebImageCodersManager;
SDWebImageDownloader 依賴 SDWebImageDownloaderOperation、SDWebImageDownloadToken、SDWebImageCodersManager;
SDWebImageCodersManager 由 SDWebImageWebPCoder、SDWebImageImageIOCoder、SDWebImageGIFCoder組成;
SDWebImageCodersManager、SDWebImageGIFCoder 實(shí)現(xiàn)了 SDWebImageCoder 的代理,SDWebImageWebPCoder、SDWebImageImageIOCoder 實(shí)現(xiàn)了 SDWebImageCoder 的子類 SDWebImageProgressiveCoder 的代理;
SDWebImageDownloaderOperation 繼承于 NSOperation ,并實(shí)現(xiàn)了SDWebImageDownloaderOperationInterface 、SDWebImageOperation的代理;
SDWebImagePrefetcher 由SDWebImageManager 和 SDWebImagePrefetcherDelegate 組成;
SDWebImage 聲明了 6個(gè) Delegate。


通常我們使用 UIImageView+WebCache 里的方法來(lái)設(shè)置網(wǎng)絡(luò)圖片的;
UIImageView+WebCache 的主要方法是調(diào)用 UIView+WebCache 里的方法;
UIView+WebCache 負(fù)責(zé)給 UIImageView 設(shè)置圖片,
** 通過(guò) SDWebImageManager 加載到圖片,
** 把得到的 image 設(shè)置給 UIImageView
SDWebImageManager 溝通 SDImageCache 和 SDWebImageDownloader ,
** 首先通過(guò) SDImageCache 查詢到是否有緩存的圖片;
** 接著如果需要下載,就通過(guò) SDWebImageDownloader 下載圖片;
** 然后如果需要緩存,把圖片緩存給 SDImageCache ;
如何使用
#import <SDWebImage/UIImageView+WebCache.h>
//常規(guī)下載
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
//獲取緩存大小
[SDImageCache sharedImageCache] getSize];
//清理內(nèi)存
[[SDImageCache sharedImageCache] clearMemory];
//清理磁盤空間
[[SDImageCache sharedImageCache] clearDisk];
總結(jié)
- 學(xué)習(xí)OC 分類
- 學(xué)習(xí)類庫(kù)文件目錄
- 學(xué)習(xí)緩存多種方式(內(nèi)存,文件,避免失敗重試,緩存文件壓縮)
探討
1. 如何避免緩存圖片,不同步問(wèn)題?
2. 隨心郵哪些地方可以加緩存(客戶端/后臺(tái))
3. 隨心郵redis內(nèi)存不夠時(shí),怎么處理?
參考鏈接:
1.代碼解讀詳細(xì)的
2.流程圖清晰
3.其他