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

從上圖可以清晰的看到 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)組成

從上圖可以看到它有四個核心模塊
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í)借鑒