SDWebImage內部實現過程
[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在初始化的時候會註冊一些訊息通知,在記憶體警告或退到後臺的時候清理記憶體圖片快取,應用結束的時候清理過期圖片。
相關文章
- 面試題 SDWebImage內部實現過程面試題Web
- oracle的內部啟動過程Oracle
- oracle最佳化sql的內部過程OracleSQL
- KVO的內部實現
- 小談java內部類物件的生成過程Java物件
- mysqldump的內部實現原理MySql
- gostring的內部實現Go
- promise實現過程Promise
- IOS SDWebImage實現原理詳解iOSWeb
- ORACLE NUMBER型別內部實現Oracle型別
- HashMap的內部實現機制HashMap
- 解讀Promise內部實現原理Promise
- KVC、KVO實現過程
- HIVE實現wordcount過程Hive
- PHP 協程實現過程詳解PHP
- ios SDWebImage新增頭部引數iOSWeb
- 【譯】Go 切片:用法和內部實現Go
- 與你探索classnames模組內部實現
- iOS 揭露Block的內部實現原理iOSBloC
- 帶你看懂Dictionary的內部實現
- 深入 Python 字典的內部實現Python
- 深入 Python 列表的內部實現Python
- MySQL Innodb_fast_shutdown引數的內部過程介紹MySqlAST
- 手寫AOP實現過程
- 手寫IOC實現過程
- 換膚功能實現過程
- Spring AOP實現過程Spring
- 精讀《JS 陣列的內部實現》JS陣列
- kafka的內部實現、安裝和使用Kafka
- Object.create(..)和new(..)的內部實現Object
- css如何實現只保留內部邊框CSS
- ICE框架元件內部實現與特點框架元件
- C#中Dictionary的內部實現剖析C#
- SDWebImage類實現圖片的下載Web
- vertica 如何實現儲存過程?儲存過程
- JWT實現過程及應用JWT
- OEM安裝報錯不是內部或外部程式的解決過程
- 【分享】Delphi的內部字串處理函式/過程不完全列表字串函式