整理了一下 SDWebImage 的時序圖:

SDWebImage時序圖
從時序圖可以看到,SDWebImage 的核心邏輯,其實也特別簡單:
1、入口是調(diào)用 UIImageView 的 sd_setImageWithURL,
這個方法是 UIImageView 的 Category (WebCache) 提供;
2、然后調(diào)用到 UIView 的 Category 里,原因是不止給 UIImageView 提供擴(kuò)展,還有 UIButton 等;
3、再調(diào)用到 SDWebImageManager 這個單例里,manager 再調(diào)用 SDImageCache 單例去內(nèi)存查找緩存,沒有找到再去 磁盤查找緩存;
4、如果都沒有,manager 調(diào)用 SDWebImageDownloader 這個單例,創(chuàng)建一個 SDWebImageDownloaderOperation 這個 NSOperation 的子類,去開啟下載任務(wù);
- SDWebImageDownloader 里用一個 dict 緩存了所有開啟的下載 Operation,避免重復(fù)創(chuàng)建下載動作;
- 并持有 NSOperationQueue 用于啟動 operation
5、如果 operation 下載成功,會將數(shù)據(jù)通過 block 回調(diào)給 SDWebImageDownloader,再傳給 SDWebImageManager,manager 會先講數(shù)據(jù)返回給 UIImageView 界面;然后,調(diào)用 SDImageCache 去緩存數(shù)據(jù)到內(nèi)存和磁盤
時序圖的 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)
源碼思維導(dǎo)圖
這個思維導(dǎo)圖來自 @雷純鋒 的一篇源碼解析,整理得非常細(xì)致,推薦:

SDWebImage
源碼解析
SDWebImage 源碼分析的文章網(wǎng)上已經(jīng)很多了,iOS SDWebImage 源碼分析及架構(gòu)設(shè)計探索 這篇里的幾幅配圖都很不錯,推薦。