1. synchronized
@synchronized(obj), obj指互斥信號量, 以同一個對象爲參數(obj)的synchronized代碼塊不會同時執行.web
![](http://static.javashuo.com/static/loading.gif)
2. 包含tableView的控制器push到新控制器
SDWebImage簡單的demo中, 第一個控制器中包含一個tableView, 點擊cell跳轉到第二個詳情控制器, 由於跳轉到第二個控制器是很是頻繁的操做, 因此這時候能夠將詳情控制器做爲根控制器的一個屬性.緩存
**tip: **當一個子控制器打開頻率很是頻繁, 或者子控制器初始化過程比較複雜時候, 能夠將自控制器做爲父控制器組合的對象來持有, 一個簡單的優化.fetch
3. SDWebImage原理
- UIImageView+WebCache: setImageWithURL:placeholderImage:options: 先顯示 placeholderImage ,同時由SDWebImageManager 根據 URL 來在本地查找圖片。
- SDWebImageManager: downloadWithURL:delegate:options:userInfo: SDWebImageManager是將UIImageView+WebCache同SDImageCache連接起來的類, SDImageCache: queryDiskCacheForKey:delegate:userInfo:用來從緩存根據CacheKey查找圖片是否已經在緩存中
- 若是內存中已經有圖片緩存, SDWebImageManager會回調SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo:
- 而 UIImageView+WebCache 則回調SDWebImageManagerDelegate: webImageManager:didFinishWithImage:來顯示圖片。
- 若是內存中沒有圖片緩存,那麼生成 NSInvocationOperation 添加到隊列,從硬盤查找圖片是否已被下載緩存。
- 根據 URLKey 在硬盤緩存目錄下嘗試讀取圖片文件。這一步是在 NSOperation 進行的操做,因此回主線程進行結果回調 notifyDelegate:。
- 若是上一操做從硬盤讀取到了圖片,將圖片添加到內存緩存中(若是空閒內存太小,會先清空內存緩存)。SDImageCacheDelegate 回調 imageCache:didFindImage:forKey:userInfo:。進而回調展現圖片。
- 若是從硬盤緩存目錄讀取不到圖片,說明全部緩存都不存在該圖片,須要下載圖片,回調 imageCache:didNotFindImageForKey:userInfo:。
- 共享或從新生成一個下載器 SDWebImageDownloader 開始下載圖片。
- 圖片下載由 NSURLConnection 來作,實現相關 delegate 來判斷圖片下載中、下載完成和下載失敗。
- connection:didReceiveData: 中利用 ImageIO 作了按圖片下載進度加載效果。
- connectionDidFinishLoading: 數據下載完成後交給 SDWebImageDecoder 作圖片解碼處理。
- 圖片解碼處理在一個 NSOperationQueue 完成,不會拖慢主線程 UI。若是有須要對下載的圖片進行二次處理,最好也在這裏完成,效率會好不少。
- 在主線程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo: 回調給 SDWebImageDownloader。
- imageDownloader:didFinishWithImage: 回調給 SDWebImageManager 告知圖片下載完成。
- 通知全部的 downloadDelegates 下載完成,回調給須要的地方展現圖片。
- 將圖片保存到 SDImageCache 中,內存緩存和硬盤緩存同時保存。
- 寫文件到硬盤在單獨 NSInvocationOperation 中完成,避免拖慢主線程。
- 若是是在iOS上運行,SDImageCache 在初始化的時候會註冊notification 到 UIApplicationDidReceiveMemoryWarningNotification 以及 UIApplicationWillTerminateNotification,在內存警告的時候清理內存圖片緩存,應用結束的時候清理過時圖片。
- SDWebImagePrefetcher 能夠預先下載圖片,方便後續使用。