SDWebImage

之前面試,讓你說說對SDWebImage的理解,其實之前有看過這個庫的代碼,但是年代久遠了,而且當時對代碼的理解力有點偏差,有點遺忘了,現在再重新看這個庫的代碼,又查了查,參看了一些博客,現在總結一下


參考博客:http://draveness.me/ios-yuan-dai-ma-jie-xi-sdwebimage/


截圖是對第三方庫的整個文件的展示,這裏面主要的是Downloader、Cache、Utils和Categories四部分


Categories包括若干個分類,其實分類,我總結是一種擴充的存在形式,在某個類不可修改或者不想修改的情況下,我們添加分類達到來擴充的目的,讓這個類有一些我們想要的方法。相比較繼承形式,分類其實還是原類,而繼承卻形成了新的類。


話題有點遠

其實我們在使用的時候最常用的是sd_setImageWithURL:placeholderImage:方法

輸入下載圖片的url和替換圖片,而他在調用sd_setImageWithURL:placeholderImage:options:progress:completed:方法。而此方法有三個功能:

1.放棄現在的Image下載

2.設置替代圖片

3.設置下載operation並且存儲起來


主要講一下下載的operation,它其實主要涉及一個SDWebImageManagerSDWebImageOperation倆個相關的類(PS:其實我覺得下載圖片和下載視頻其實是一件挺相似的事情,只是視頻下載數據量大一點而已。而且如果我們去看一下那些主流的視頻軟件,他們通常是把視頻剪成很多段,然後分段下載和使用。而之前我問個別人這樣的問題,假如要下載大量的視頻,你該怎樣做,很多人都說就放到GCD中下載就行了,我覺得這樣做很雞肋,難道你不需要對你的下載的視頻操作任務進行管理嗎,如果用戶要刪除正在下載的視頻呢?所以在SDWebImage實際上是形成了一個下載operation,然後存儲起來,所以下載任務的設置和正在下載功能的設置是分開的,而這個UIImageView+WebCache分類很明顯只是設置了下載任務並且存儲起來,也就是將某個url的下載任務放到了一個下載池裏面。)



SDWebImageManager類其實是一個單例方法。


其中最主要的下載方法是downloadImageWithURL:options:progress:completed:也就是SDWebImage的核心功能區域,他既要實現圖片下載,又要把下載的圖片緩存起來,具體怎麼實現,想了解的人可以具體看一下代碼。


當然,圖片的下載和緩存都是涉及到方方面的,所以在SDWebImageManager有倆個SDWebImageDownloaderSDImageCache類屬性,這纔是真正的下載和緩存功能代碼區域。而SDWebImageManager實際上是聯繫這倆者的橋樑,即SDWebImageManager調度SDWebImageDownloaderSDImageCache形成圖片的下載和緩存的operation,而UIImageView+WebCache通過調度SDWebImageManager方法設置獲取下載的圖片



我覺得核心就是我上面講的東西。



SDWebImageDownloader


如圖中解釋,這個類實現了圖片的異步下載和加載優化

核心代碼在downloadImageWithURL:options:progress:completed:


所以我總結起來這個類是對下載的一個高度抽象



SDImageCache


如圖中解釋,它就是管理內存緩存和硬盤緩存的。而硬盤緩存寫入任務是異步執行的,所以他不會延遲UI.



SDWebImageDownloaderOperation繼承自NSOperation,形成下載任務方便存儲起來,方便之後執行。所以其實整個這個圖片下載還運用了NSOperation和NSOperationQueue,執行多任務下載等等



我所理解的SDWebImage沒有講解很多細節的問題,這個我覺得自己看可能會收穫更多吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章