SDWebImage源碼學習合集目錄swift
SDWebImage能夠用來快速下載展現網絡圖片,最簡單的使用只須要一行代碼:緩存
//var imageView: UIImageView!
//var imageURL: NSURL!
imageView.sd_setImage(with: imageURL)
複製代碼
就能夠給UIImageView設置網絡圖片,SD內部自行管理下載,緩存,解碼,徹底不用任何額外操做安全
稍微複雜點的用法能夠本身配置圖片下載的模式,緩存的邏輯,不一樣格式的解碼器,數據加密等markdown
在高級一點的用法,能夠自定義下載器,自定義緩存器:包括磁盤緩存與內存緩存,自定義解碼器網絡
全部的這一切,SDWebImage內部都作了很好的封裝與解耦,提供了很強大功能的同時也支持很是靈活的擴展,5.0後甚至能夠經過添加插件來使用FLAnimatedImage,YYImage第三方庫做爲插件的方式集成進來一塊兒使用。very牛逼!架構
學習SDWebImage的源碼,能夠學習他的架構設計,模塊管理,內部的解耦思想,對項目架構設計有很好的啓發。並且SD源碼中帶有很詳細的文檔說明,各個模塊甚至還有類圖說明,很方便學習他的設計原理。框架
引用下SDWebImage官方的框架圖:異步
從上往下:工具
SD顯示對UI層須要設置網絡圖片的控件進行了擴展,包括UIImageView,UIButton,NSButton(mscOS下),添加了便捷根據URL設置網絡圖片的方法,方法通過各類抽象,有最簡單的設置一個URL,也有最複雜的設置URL,佔位圖,下載選項,下載上下文,進度回調,完成回調等,又由於這些控件的父類都是UIView,所以對UIView進行了擴展,來使用SDWebImageManager來對圖片進行下載處理。post
當UIImageView調用分類設置圖片URL時,在分類方法中,會依賴到Indicator接口來設置進度指示器,以及Transition接口來設置圖片展現時的動畫效果,封裝處理好下載所需的options與須要貫穿在整個下載過程當中的context上下文後,分類中開始準備使用SDWebImageManager來進行圖片獲取,在這個過程當中,注入了ImagePrefetcher圖片預加載器接口,容許能夠在UIImageView準備下載圖片以前,先對即將要下載的URL集合進行預下載,預加載完成後會把圖片緩存起來,這樣在SDWebImageManager準備獲取圖片時,能夠快速直接讀取緩存圖片,節省時間。
SD的核心是SDWebImageManager類,這個類依賴着ImageCache接口來管理緩存,ImageLoader接口來管理下載,在收到UI分類中的獲取圖片指令以後,SDWebImageManager經過調度持有的cacher與loader高效的進行圖片的緩存與下載,同時可使用options+context來配置緩存與下載的邏輯
使用抽象接口SDImageCache來定義緩存器,提供高度自定義化的同時,提供同名的默認實現類,而每個ImageCache接口又依賴於兩個細化的緩存接口:SDMemoryCache與SDDiskCache,分別用來管理內存緩存與磁盤緩存,也分別提供了同名的默認實現類
SDMemoryCache:使用weak map table實現的內存緩存管理器,保存了須要緩存在內存中的Image對象,並可根據系統內存進行優化,在內存緊張時還會經過釋放不被視圖強持有的圖片資源來減輕內存負擔。
SDDiskCache:把圖片的數據寫入到磁盤緩存或者從磁盤讀取緩存的數據來供UI層使用,並提供了多鍾過時規則供自由選擇使用,磁盤操做所有都在內部串行的IO隊列上同步或者異步的執行,全部數據敏感的操做都進行的加鎖保護,緩存的數據能夠在網絡圖片下載完成後寫入到磁盤,使用時讀取Data並進行解碼後返回給UI層使用,同時會順便寫入內存緩存來加快下次訪問速度。
緩存器還提供SDImageCachesManager來管理多個緩存器,且這個manager自己也實現了緩存器接口,能夠做爲緩存器使用,sd內部會自動選擇合適的緩存器來處理
使用抽象接口SDImageLoader來定義下載器,提供同名默認實現類,持有URLSesson來從網絡下載圖片,也可使用Photos框架來異步從相冊獲取圖片。
在下載網絡圖片時,使用Operation在下載隊列執行下載任務,使用op複用技術來支持在對同一個url進行屢次加載時,複用同一個下載op,節約資源開銷。
提供SDImageLoadersManager來管理多個下載器,自己也實現了下載器接口,做爲默認的下載器使用。
除了上層的UI層擴展,底層還有不少其餘的模塊來協助工做。
包括對圖片數據的定義,輔助繪圖,動圖處理等。
使用SDImageCoder接口定義編解碼器,還有一些輔助類來協助圖片的編解碼操做,默認提供了IOCoder,HEICCoder,GIFCoder,ANimatedCoder,WebPCoder,APNGCoder等編解碼器來快速對各類圖片數據下載完成後進行解碼操做供UI層展現,後者對Image進行編碼操做後給緩存器緩存到磁盤使用。
還提供了SDImageCOdersManager來管理多個圖片解碼器,能夠自動根據圖片的類型選擇合適的解碼器使用,自己也實現了SDImageCoder協議,做爲默認的解碼器來使用。
使用SDImageTransformer接口定義圖片變換器,容許在對圖片解碼完成以後,對Image進行變換獲得新的Image來使用,好比對圖片進行圓角處理,縮放處理等。
提供了SDImagePipelineTransformer管道變換器,來管理多個變換器,自己也實現了變換器接口,能夠對管理的多個圖片變換器以管道的形式來逐個處理圖像。
基於安全設置,下載過來的圖片數據多是加密的,SD提供了SDWebImageDownloaderDecryptor接口定義圖片數據解密器,方便快速實現自定義的解密器,對圖片數據解碼以前,會先異步對原數據進行解密操做以後再進行解碼處理,默認提供了Base64解密器。
不過要注意的是解密器不支持進度圖片下載,由於加密後的數據在部分下載過來時沒法解密出部分圖片信息,所以沒法邊下載邊展現。
一樣套用官方的最最最最最完整的類圖: (點擊放大)
簡單介紹一下:
以上就是我的對SDWebImage框架的初步瞭解,後續會一個個模塊的學習分析下框架的設計理念,並記錄下我的的看法,若有錯誤,歡迎評論指正~感激涕零~