圖解SDWebImage

yehot發表於2019-05-08

SDWebImage 時序圖:

整理了一下 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

原始碼解析

SDWebImage 原始碼分析的文章網上已經很多了,iOS SDWebImage 原始碼分析及架構設計探索 這篇裡的幾幅配圖都很不錯,推薦。

相關文章