SDWebImage源碼學(xué)習(xí)

以前對SDWebImage僅僅停留在使用的層面上,沒有加以深入了解過。最近工作不是很忙。就對SDWebImage的源碼研究學(xué)習(xí)了一下。感受頗深,尤其是它對整個第三框架的設(shè)計,功能劃分十分清晰明了。感覺學(xué)到了很多東西。

直接來看關(guān)鍵點吧

SDWebImage 圖片加載過程

image

從上圖可以清晰的看到 SDWebImage的整個加載過程

1 首先是外部對象調(diào)用sd_setImageWithURL()

2 其內(nèi)部多次調(diào)用后到調(diào)用UIView的sd_internalSetImageWithURL()方法。在這個方法內(nèi)部 首先會去看當(dāng)前view 是否有正在下載的任務(wù) operation,如果有就取消掉。沒有就先創(chuàng)建一個 SDWebImageManager,然后設(shè)置下載任務(wù)得到一個operation,并保存。

3 SDWebImageManager 會調(diào)用其核心方法loadImageWithURL() 在這個方法內(nèi)部首先會創(chuàng)建一個 SDWebImageCombinedOperation 任務(wù)并進行配置。首先會通過imageCache 調(diào)用queryDiskCacheForKey()查內(nèi)存中是否有對應(yīng)的url緩存,如果有就直接調(diào)返回。沒有則通過異步再去查詢磁盤上是否有。有的話就返回。如果沒有則通過SDWebImageDownloader的downloadImage()方法去下載圖片。待下載完成進行回調(diào),回調(diào)到SDWebImageManager 則使用imageCache 對圖片進行緩存操作。

4 然后一步步回調(diào)回使用者

接下來看一下 SDWebImage 架構(gòu)組成

image

從上圖可以看到它有四個核心模塊

Utils

SDWebImageManager:實現(xiàn)圖片的下載緩存管理,對外提供方法

SDWebImagePrefetcher:實現(xiàn)圖片的預(yù)加載

SDWebImageTransition:實現(xiàn)圖片加載完畢后的顯示動畫,支持擴展

Download

SDWebImageDownloader 下載模塊 管理下載隊列
SDWebImageDownloaderOperation 管理具體的下載任務(wù)

Cache

SDImageCache 緩存的各種操作

SDImageCacheConfig 緩存配置信息

Coder

各種解碼

SDWebImageCodersManager:圖片編碼中心,支持拓展

SDWebImageCoder:圖片編碼協(xié)議集,自行拓展的分類必須支持此協(xié)議

SDWebImageImageIOCoder:PNG、JPEG、TIFF圖片的解碼

SDWebImageGIFCoder:GIF的解碼

SDWebImageWebPCoder:Webp的解碼

SDWebImageFrame:動圖設(shè)置相關(guān)類組合

SDWebImageCoderHelper:圖片解碼相關(guān)幫助方法

SDAnimatedImageRep:NSBitmapImageRep的子類,加快NSBitmapImageRep的渲染

總結(jié):查看了源碼可以在開發(fā)過程匯總更好的使用修改,補充一些東西為自己所用。最重要的感覺是其對整個框架的功能拆分,實現(xiàn)流程,任務(wù)記錄,回調(diào)處理都值得學(xué)習(xí)借鑒

?著作權(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)容

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