SDWebImage內部實現過程

jingxianli0922發表於2015-11-15
第三方開源在給我們帶來便利的同時也會讓我們偷懶,不去真真理解其中的原理。平時專案開發中,經常我們會涉及到圖片的下載,可能我們對下面的程式碼的並不陌生:
[self.iconView setImageWithURL:[NSURL URLWithString:user.profile_image_url] placeholderImage:[UIImage imageWithName:@"avatar_default_small"]];

今天說說SDWebImage具體為我們做了哪些事:

1.呼叫setImageWithURL:placeholderImage:會先把placeholderImage顯示。然後SDWebImageManager根據使用者提供的URL開始處理圖片。

2.進入SDWebImageManager:downloadWithURL:delegate:options,交給SDImageCache從快取查詢圖片是否已經下載。

3.首先會從記憶體圖片快取中查詢是否有該圖片,如果有該圖片,SDImageCacheDelegate回撥imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。

4.SDWebImageManagerDelegate回撥webImageManager:didFinishWithImage:到UIImageView+WebCache到前端顯示圖片。

5.如果記憶體快取中沒有,生成NSInvocationOperation新增到佇列開始從硬碟查詢圖片是否已經快取。

6.根據URLKey在硬碟快取目錄下嘗試讀取圖片檔案。

7.如果步驟6從硬碟中讀取到了圖片,將圖片新增到記憶體快取中(如果空閒記憶體過小,會先清空記憶體快取)。SDImageCacheDelegate回撥imageCache:didFindImage:forkey展示圖片。

8.如果從硬碟快取目錄中讀取不到圖片,說明所有快取都不存在該圖片,需要下載圖片,回撥imageCache:didNotFindImageForkey.

9.共享或重新生成一個下載器SDWebImageDownloader開始下載圖片。

10.圖片下載由NSURLConnection來完成,利用delegate判斷圖片下載中、下載完成和下載完成。同時也通過connection:didReceiveData:中利用ImageIO做了按圖片下載進度載入效果。

11.connectionDidFinishLoading:圖片下載完成後交給SDWebImageDecoder做圖片解碼處理。

12.圖片解碼處理在一個NSOperationQueue子執行緒完成,不會拖慢主執行緒UI。如果有需要對下載的圖片進行二次處理,最好在解碼過程完成,效果也會很好。

13.在主執行緒notifyDelegateOnMainThreadWithInfo:宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo:回撥給SDWebImageDownloader。

14.imageDownloader:didFinishWithImage:回撥給SDWebImageManager告知圖片下載完成。

15.利用通知訊息機制告知所有的downloadDelegates下載完成,回撥給需要的地方展示圖片。

16.將下載的圖片儲存到SDImageCache中,同時也儲存記憶體快取和硬碟快取。寫檔案到硬碟是單獨在NSInvocationOperation完成,避免拖慢主執行緒。

17.SDImageCache在初始化的時候會註冊一些訊息通知,在記憶體警告或退到後臺的時候清理記憶體圖片快取,應用結束的時候清理過期圖片。

相關文章