SDWebImage的用處就不必多說了,相信有很多人跟我一樣一直在用它.這是下載的網址,下載導入項目即可https://github.com/rs/SDWebImage,也可以使用cocopods,
?pod 'SDWebImage' 執行pod install即可,
在使用時導入#import "UIImageView+WebCache.h"當然在實際開發中我們會對它進行二次的封裝,在這里我就不多解釋.舊版本的跟新版本的有所不同,我們現在只說新版本的:
一,使用:
在使用中會發現有下面的api來供我們下載圖片
1. sd_setImageWithURL:
2//圖片緩存的基本代碼,就是這么簡單
[self.image1?sd_setImageWithURL:imagePath1];
2. sd_setImageWithURL:? completed://用block?可以在圖片加載完成之后做些事情
[self.image2?sd_setImageWithURL:imagePath2?completed:^(UIImage?*image,?NSError?*error,?SDImageCacheType?cacheType,?NSURL?*imageURL)?{
NSLog(@"這里可以在圖片加載完成之后做些事情");
}];
3. sd_setImageWithURL:? placeholderImage://給一張默認圖片,先使用默認圖片,當圖片加載完成后再替換
[self.image1?sd_setImageWithURL:imagePath1?placeholderImage:[UIImage?imageNamed:@"default"]];
4. sd_setImageWithURL:? placeholderImage:? completed://使用默認圖片,而且用block?在完成后做一些事情
[self.image1?sd_setImageWithURL:imagePath1?placeholderImage:[UIImage?imageNamed:@"default"]?completed:^(UIImage?*image,?NSError?*error,?SDImageCacheType?cacheType,?NSURL?*imageURL)?{
NSLog(@"圖片加載完成后做的事情");
}];
5. sd_setImageWithURL:? placeholderImage:? options://這個方法加了一個策略
typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
默認情況下,當URL無法下載時,URL就會被列入黑名單,這樣庫就不會繼續嘗試了。
SDWebImageRetryFailed = 1 << 0,
默認情況下,圖像下載是在UI交互期間啟動的,這標志禁用該特性,
SDWebImageLowPriority = 1 << 1,
此標記禁用磁盤緩存
SDWebImageCacheMemoryOnly = 1 << 2,
此標志可以進行漸進式下載,在下載過程中,圖像會逐步顯示,就像瀏覽器所做的那樣。
SDWebImageProgressiveDownload = 1 << 3,
即使緩存了映像,也要尊重HTTP響應緩存控制,并在需要的情況下從遠程位置刷新映像。
磁盤緩存將由NSURLCache來處理,而不是使用SDWebImage,這會導致輕微的性能下降。
這個選項有助于處理在同一個請求URL后面更改的圖像,例如Facebook圖形api概要圖。
如果刷新了緩存的圖像,那么完成塊就會被緩存的圖像和最后的圖像再次調用一次。
只有當你不能用嵌入的緩存破壞參數使你的url靜態時,才使用這個標志。
SDWebImageRefreshCached = 1 << 4,
在iOS 4+中,如果應用程序進入后臺,可以繼續下載圖片。這是通過詢問系統來實現的
SDWebImageContinueInBackground = 1 << 5,
通過設置來處理NSHTTPCookieStore中存儲的cookie
* NSMutableURLRequest。HTTPShouldHandleCookies =是的;
SDWebImageHandleCookies = 1 << 6,
啟用不受信任的SSL證書。
用于測試目的。在生產中使用謹慎。
SDWebImageAllowInvalidSSLCertificates = 1 << 7,
默認情況下,圖像按順序裝載在隊列中。這面旗將它們移動到
隊列的前面。
SDWebImageHighPriority = 1 << 8,
默認情況下,在圖像加載時加載占位符圖像。這個標志會延遲加載
在圖像完成加載后,占位符圖像。
SDWebImageDelayPlaceholder = 1 << 9,
我們通常不會在動畫圖像上調用transformdownloade昏暗委托方法,
因為大多數轉換代碼會將其轉換成代碼。
SDWebImageTransformAnimatedImage = 1 << 10,
默認情況下,圖像會在下載后添加到imageView中。但在某些情況下,我們想要
在設置圖像之前要有手(例如,應用一個濾鏡或者用交叉衰減動畫來添加)
如果您想在成功完成時手動設置圖像,請使用此標志
SDWebImageAvoidAutoSetImage = 1 << 11,
默認情況下,圖像會被解碼,以尊重它們原來的大小。在iOS上,這個標志會縮小
圖像大小與設備的受限內存相兼容。
*如果“SDWebImageProgressiveDownload”標志設置禁用縮減。
SDWebImageScaleDownLargeImages = 1 << 12
};
二、SDWebImage內部原理
入口 setImageWithURL:placeholderImage:options: 會先把 placeholderImage 顯示,然后 SDWebImageManager 根據 URL 開始處理圖片。
進入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給 SDImageCache 從緩存查找圖片是否已經下載 queryDiskCacheForKey:delegate:userInfo:.
先從內存圖片緩存查找是否有圖片,如果內存中已經有圖片緩存,SDImageCacheDelegate 回調 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
SDWebImageManagerDelegate 回調 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示圖片。
如果內存緩存中沒有,生成 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 完成,避免拖慢主線程。
SDImageCache 在初始化的時候會注冊一些消息通知,在內存警告或退到后臺的時候清理內存圖片緩存,應用結束的時候清理過期圖片。
SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
SDWebImagePrefetcher 可以預先下載圖片,方便后續使用。
內容參考自:http://www.cocoachina.com/ios/20141212/10622.html