SDWebImage 時序圖:
整理了一下 SDWebImage 的時序圖:
從時序圖可以看到,SDWebImage 的核心邏輯,其實也特別簡單:
1、入口是呼叫 UIImageView 的 sd_setImageWithURL
,
這個方法是 UIImageView 的 Category (WebCache) 提供;
2、然後呼叫到 UIView 的 Category 裡,原因是不止給 UIImageView 提供擴充套件,還有 UIButton 等;
3、再呼叫到 SDWebImageManager 這個單例裡,manager 再呼叫 SDImageCache 單例去記憶體查詢快取,沒有找到再去 磁碟查詢快取;
4、如果都沒有,manager 呼叫 SDWebImageDownloader 這個單例,建立一個 SDWebImageDownloaderOperation 這個 NSOperation 的子類,去開啟下載任務;
- SDWebImageDownloader 裡用一個 dict 快取了所有開啟的下載 Operation,避免重複建立下載動作;
- 並持有 NSOperationQueue 用於啟動 operation
5、如果 operation 下載成功,會將資料通過 block 回撥給 SDWebImageDownloader,再傳給 SDWebImageManager,manager 會先講資料返回給 UIImageView 介面;然後,呼叫 SDImageCache 去快取資料到記憶體和磁碟;
時序圖的 markdown 原始碼如下:
sequenceDiagram
participant UIImageView
participant UIImageView(WebCache)
participant UIView(WebCache)
participant SDWebImageManager
participant SDImageCache
participant SDWebImageDownloader
participant SDWebImageDownloaderOperation
UIImageView->>UIImageView(WebCache): sd_setImageWithURL()
activate UIImageView(WebCache)
UIImageView(WebCache)->>UIView(WebCache): sd_internalSetImageWithURL()
UIView(WebCache)->>SDWebImageManager:loadImageWithURL()
alt hit memery cache
SDWebImageManager->>SDImageCache:queryCacheOperationForKey()
SDImageCache-->>SDWebImageManager:memory image
else hit disk cache
SDWebImageManager->>SDImageCache:imageFromMemoryCacheForKey()
SDImageCache-->>SDWebImageManager:diskImageForKey()
end
opt no cache
SDWebImageManager->>SDWebImageDownloader:downloadImageWithURL()
SDWebImageDownloader->>SDWebImageDownloaderOperation:initWithRequest()
SDWebImageDownloaderOperation-->>SDWebImageDownloader: SDWebImageDownloaderCompletedBlock()
SDWebImageDownloader-->>SDWebImageManager:SDWebImageDownloaderCompletedBlock()
SDWebImageManager->>SDImageCache:storeImage()
end
SDWebImageManager-->>UIView(WebCache):image
UIView(WebCache)-->>UIImageView(WebCache):sd_setImage()
UIImageView(WebCache)-->>UIImageView:setImage()
deactivate UIImageView(WebCache)
複製程式碼
SDWebImage 原始碼思維導圖
這個思維導圖來自 @雷純鋒 的一篇原始碼解析,整理得非常細緻,推薦:
原始碼解析
SDWebImage 原始碼分析的文章網上已經很多了,iOS SDWebImage 原始碼分析及架構設計探索 這篇裡的幾幅配圖都很不錯,推薦。