像我這樣的菜鳥剛開始用SDWebImage只會用sd_setImageWithUrl:。認為緩存圖片就夠了览绿,但是SDWebImage有強大的東西我們還沒有發(fā)現窿祥,來一探究竟~
最簡單的,sd_setBackGroundImageWithUrl: (PS:各位大神不要打我, 因為我之前并不知道SDWebImage是可以緩存button的圖片) 緩存button背景圖片 當然還能聯(lián)想出包含titleColor的方法
其次我們說一下SDWebImage的精髓 :“options所有選項"
options 想必有些菜鳥跟我一樣也沒用過這個東西吧
//失敗后重試
SDWebImageRetryFailed = 0,
//UI交互期開始下載庇麦,導致延遲下載比如UIScrollView減速
SDWebImageLowPriority = 1
//只進行內存緩存
SDWebImageCacheMemoryOnly = 2
//這個標志可以漸進式下載计技,顯示的圖像是在逐步下載
SDWebImageProgressiveDownload = 3
//刷新緩存
SDWebImageRefreshCached = 4
//后臺下載
SDWebImageContinueInBackground = 5
//NSMUtableURLRequest.HTTPShouldHandleCookies = YES
SDWebImageHandleCookies = 6
//允許使用無效的SSL證書
SDWebImageAllowInvalidSSLCertificates = 7
//優(yōu)化下載
SDWebImageHighPriority = 8
//延遲占位符
SDWebImageDelayPlaceholder = 9,
//改變動畫形象
SDWebImageTransformAnimatedImage = 10
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.如果內存緩存中沒有饮醇,生成 NSInvocationOperation 添加到隊列開始從硬盤查找圖片是否已經緩存它抱。
6.根據 URLKey 在硬盤緩存目錄下嘗試讀取圖片文件。這一步是在 NSOperation 進行的操作朴艰,所以回主線程進行結果回調 notifyDelegate:观蓄。
7.如果上一操作從硬盤讀取到了圖片,將圖片添加到內存緩存中(如果空閑內存過小呵晚,會先清空內存緩存)蜘腌。SDImageCacheDelegate 回調 imageCache:didFindImage:forKey:userInfo:。進而回調展示圖片饵隙。
8.如果從硬盤緩存目錄讀取不到圖片撮珠,說明所有緩存都不存在該圖片,需要下載圖片,回調 imageCache:didNotFindImageForKey:userInfo:芯急。
9.共享或重新生成一個下載器 SDWebImageDownloader 開始下載圖片勺届。
10.圖片下載由 NSURLConnection 來做,實現相關 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 中,內存緩存和硬盤緩存同時保存碌廓。寫文件到硬盤也在以單獨 NSInvocationOperation 完成传轰,避免拖慢主線程。
18.SDImageCache 在初始化的時候會注冊一些消息通知氓皱,在內存警告或退到后臺的時候清理內存圖片緩存路召,應用結束的時候清理過期圖片勃刨。
19.SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache波材,方便使用。
20.SDWebImagePrefetcher 可以預先下載圖片身隐,方便后續(xù)使用廷区。
最后給大家講一個比較有用的 在加載圖片時和完成加載時的可以做的方法
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {
NSLog(@"顯示當前進度");
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
NSLog(@"下載完成");
}];