SDweSDWebImage
提供一個UIImageView
的類別以支持加載來自互聯網的遠程圖片。具有緩存管理、異步下載,同一個URL
下載次數控制和優化等特征。
獨立的異步圖像下載
可能會用到單獨的異步圖片下載,則一定要用 - (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionWithFinishedBlock)completedBlock;
來建立一個SDWebImageDownLoader
的實例。這樣就可以有下載進度的回調和下載完成的回調,可以在回調完成進度條相關的操作和顯示圖片相關的操作。
獨立的異步圖像緩存
SDImageCache
類提供一個管理緩存的單例類。
SDImageCache *imageCache = [SDImageCache sharedImageCache];
查找和緩存圖片時以URL
作為key
。(先查找內存,如果內存不存在該圖片,再查找硬盤;查找硬盤時,以URL
的MD5
值作為key
).
查找圖片:
UIImage *cacheImage = [imageCache mageFromKey:myCacheKey];
緩存圖片:
[ imageCache storeImage:myImage forKey:myCacheKey];
默認情況下,圖片是被存儲到內存緩存和磁盤緩存中的。如果僅僅是想緩存到內存中,可以用下面方法:
storeImage:forKey:toDisk:
第三個參數傳NO
即可。
主要用到的對象:
1.UIImageView(WebCache)
,入口封裝,實現讀取圖片完成后的回調。
2.SDWebImagemanager
,對圖片進行管理的中轉站,記錄那些圖片正在讀取。向下層讀取Cache
(調用SDImageCache
),或者向網絡讀取對象(調用SDWebImageDownloader
)。實現SDImageCache
和SDWebImageDownLoader
的回調。
3.SDImageCache
,根據URL
作為key
,對圖片進行存儲和讀取(存在內存(以URL
作為key
)和存在硬盤兩種(以URL
的MD5
值作為key
))。實現圖片和內存清理工作。
SDWebImage
加載圖片的流程
1.入口 setImageWithURL:placeholderImage:options:
會先把 placeholderImage
顯示,然后SDWebImageManager
根據URL
開始處理圖片。
2.進入SDWebImageManager
類中downloadWithURL:delegate:options:userInfo:
,交給
SDImageCache
從緩存查找圖片是否已經下載
queryDiskCacheForKey:delegate:userInfo:.
3.先從內存圖片緩存查找是否有圖片,如果內存中已經有圖片緩存,SDImageCacheDelegate
回調 imageCache:didFindImage:forKey:userInfo:
到
SDWebImageManager
。
4.SDWebImageManagerDelegate
回調
webImageManager:didFinishWithImage:
到 UIImageView+WebCache
,等前端展示圖片。
5.如果內存緩存中沒有,生成 NSOperation
添加到隊列,開始從硬盤查找圖片是否已經緩存。
6.根據URL
的MD5
值Key
在硬盤緩存目錄下嘗試讀取圖片文件。這一步是在 NSOperation
進行的操作,所以回主線程進行結果回調 notifyDelegate:
。
7.如果上一操作從硬盤讀取到了圖片,將圖片添加到內存緩存中(如果空閑內存過小, 會先清空內存緩存)。SDImageCacheDelegate
回調 imageCache:didFindImage:forKey:userInfo:
。進而回調展示圖片。
8.如果從硬盤緩存目錄讀取不到圖片,說明所有緩存都不存在該圖片,需要下載圖片, 回調 imageCache:didNotFindImageForKey:userInfo:
。
9.共享或重新生成一個下載器SDWebImageDownloader
開始下載圖片。
10.圖片下載由NSURLSession
來做,實現相關 delegate
來判斷圖片下載中、下載完成和下載失敗。
11.connection:didReceiveData:
中利用 ImageIO
做了按圖片下載進度加載效果。
12.connectionDidFinishLoading:
數據下載完成后交給 SDWebImageDecoder
做圖片解碼處理。
13.圖片解碼處理在一個 NSOperationQueue
完成,不會拖慢主線程UI
.如果有需要 對下載的圖片進行二次處理,最好也在這里完成,效率會好很多。
14.在主線程notifyDelegateOnMainThreadWithInfo:
宣告解碼完成 imageDecoder:didFinishDecodingImage:userInfo:
回調給 SDWebImageDownloader
。
15.imageDownloader:didFinishWithImage:
回調給 SDWebImageManager
告知圖片 下載完成。
16. 通知所有的downloadDelegates
下載完成,回調給需要的地方展示圖片。
17.將圖片保存到 SDImageCache
中,內存緩存和硬盤緩存同時保存。寫文件到硬盤 也在以單獨NSOperation
完成,避免拖慢主線程。
18.SDImageCache
在初始化的時候會注冊一些消息通知,
在內存警告或退到后臺的時 候清理內存圖片緩存,應用結束的時候清理過期圖片。