iOS之路22-SDWebImage緩存機制代碼上有變化

  1. SDWebImage 的緩存原理緩存

1) UIImageView+WebCache 中的setImageWithURL:placeholder... 先顯示佔位圖片, 同時由SDWebImageManager根據URL來在本地查找圖片fetch

2) SDImageCache: queryDiskCacheForKey: 用來從緩存中根據Key查找圖片, 這個方法頗有意思, 會先判斷裏面傳入的參數Key和block參數是否都是空, 若是是返回nil, 寫的比較嚴謹.spa

3) 若是內存中已經有圖片緩存, SDWebImageManager 以前是會回調一個方法didFindImage方法, 如今最新版本的是利用block把圖片和緩存類型傳出去, 把block傳進去,在適當的時候執行block, 把圖片顯示出來線程

4)UIImageView + WebCache則會回調SDWebImageManagerDelegate   的這個方法didFinishWithImage的方法來顯示圖片code

5) 若是內存中沒有圖片緩存, 那麼生成NSInvocationOperation添加到隊列當中, 從硬盤查找圖片是否已被下載緩存orm

6) 根據URLKey 在硬盤緩存目錄下嘗試讀取圖片文件, 這一步NSOperation進行的操做, 因此回主線程結果回調 notifyDelegate:方法隊列

7) 若是上一操做從硬盤讀取到了圖片, 將圖片添加到內存緩存當中(若是空閒較小,會先清空內存緩存)SDImageCacheDelegate回調 didFindImage:方法, 從而展現圖片圖片

8) 若是從硬盤緩存目錄讀取不到圖片, 說明全部緩存都不存在該圖片, 調用didNotFindImageForKey:圖片方法內存


4\5\6\7步驟如今都已經寫在一個block裏面了ci


9) 共享或從新生成一個下載器 SDWebImageDownloader開始下載圖片回調 

如今是SDWebImageDownloaderCompletedBlock下載圖片\


10) 圖片下載由NSURLConnection來作, 實現相關delegate, 下載完成, 下載中, 下載失敗等等

11) didReceiveData 用了imageIO作了下載進度加載效果

12) connectionDidFinishLoadings數據下載完成後交給SDWebImageDecoder作圖片解碼處理

13) 圖片解碼處理在一個NSOperationQueue完成, 不會拖慢主線程的UI, 若是有須要對下載好的圖片進行二次處理, 最好也在這裏, 效率會好不少

14) 在主線程宣告解碼完成時, 回調didFinishDecodingImage 方法,給SDWebImageDownloader, 

15) imageDownloader didFinishWithImage回調給SDWebImageManager 告知圖片下載完成

16) 通知全部的downloadDelegate下載完成了, 回調給須要的地方展現圖片, 

17) 將圖片保存到 SDImageCache中, 內存緩存和磁盤緩存中

18) 寫文件到硬盤在單獨NSInvocationOperation中進行, 避免拖慢主線程

19) SDImageCache在初始化的時候會註冊通知, notification到DidReceiveMemoryWarningNotifacition, 在內存警告的時候, 清理緩存圖片

20) SDWebImagePrefetcher 能夠預先下載圖片, 方便後續使用


若有錯誤,請批評指正

相關文章
相關標籤/搜索