前言
在 iOS 的圖片加載框架中,SDWebImage 可謂是占據大半壁江山。它支持從網絡中下載且緩存圖片,并設置圖片到對應的 UIImageView 控件或者 UIButton 控件。在項目中使用 SDWebImage 來管理圖片加載相關操作可以極大地提高開發效率,讓我們更加專注于業務邏輯實現。
功能
1.提供了一個 UIImageView 的 category(分類)用來加載網絡圖片并且對網絡圖片的緩存進行管理
2.采用異步方式來下載網絡圖片
3.異步內存+磁盤映像緩存,并且自動處理過期的緩存圖片
4.支持 GIF 動畫
5.支持 WebP 格式
6.同一個 URL 的網絡圖片不會被重復下載
7.失效的 URL 不會被無限重試
8.耗時操作都在子線程,確保不會阻塞主線程
9.支持圖片壓縮跟解碼
10....
文件結構圖
解讀SDWebImage UML 類圖 和 流程圖
我們便于調用的類別依賴于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。
通常我們使用 UIImageView+WebCache 里的方法來設置網絡圖片的;
UIImageView+WebCache 的主要方法是調用 UIView+WebCache 里的方法;
UIView+WebCache 負責給 UIImageView 設置圖片,
** 通過 SDWebImageManager 加載到圖片,
** 把得到的 image 設置給 UIImageView
SDWebImageManager 溝通 SDImageCache 和 SDWebImageDownloader ,
** 首先通過 SDImageCache 查詢到是否有緩存的圖片;
** 接著如果需要下載,就通過 SDWebImageDownloader 下載圖片;
** 然后如果需要緩存,把圖片緩存給 SDImageCache ;
如何使用
#import <SDWebImage/UIImageView+WebCache.h>
//常規下載
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
//獲取緩存大小
[SDImageCache sharedImageCache] getSize];
//清理內存
[[SDImageCache sharedImageCache] clearMemory];
//清理磁盤空間
[[SDImageCache sharedImageCache] clearDisk];
總結
- 學習OC 分類
- 學習類庫文件目錄
- 學習緩存多種方式(內存,文件,避免失敗重試,緩存文件壓縮)
探討
1. 如何避免緩存圖片,不同步問題?
2. 隨心郵哪些地方可以加緩存(客戶端/后臺)
3. 隨心郵redis內存不夠時,怎么處理?