圖解 SDWebImage

整理了一下 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è)計探索 這篇里的幾幅配圖都很不錯,推薦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我不知道怎么回事,一個寒假中做三次一樣的夢。 夢是這樣的:一天晚上,我拿著乒乓板去一個叫江亭社區(qū)的地方去看一...
    李沛臻閱讀 345評論 1 2
  • 走過的歲月 你并不在乎 留下一段空白 用我真心能否彌補(bǔ) 裝滿所有空間的愛 鎖不動你徘徊的腳步 尋著你的足跡 我似迷...
    張景煒閱讀 311評論 1 5
  • 今天臺風(fēng),在家休息。 昨晚已有臺風(fēng)跡象,接matt放學(xué)下電梯時,我叫他不要跑,不要跑。沒聽我的話,果然地滑摔跤了,...
    親親_3199閱讀 232評論 0 0
  • 項目管理 -- SVN 使用指令 SVN 是一個很經(jīng)典的版本管理工具,由于本人涉足編程領(lǐng)域時間并不長,對SVN的了...
    MooGoo閱讀 3,099評論 0 1
  • 聲明: 學(xué)習(xí)資源來源于 HTML 5 視頻,本人只是學(xué)習(xí)一下. H5是HTML、XHTML以及HTML DOM的新...
    想跳舞的螞蟻閱讀 340評論 0 1

友情鏈接更多精彩內(nèi)容