SDWebImage是當(dāng)下最流行的一個三方圖片處理框架,我們使用較多的是它提供的UIImageView分類,支持從遠(yuǎn)程服務(wù)器下載并緩存圖片。
SDWebImage框架常用方法:
- 根據(jù)圖片的url下載圖片并設(shè)置到ImageView上面去
/* *
* 根據(jù)圖片的url下載圖片并設(shè)置到ImageView上面去(進行磁盤緩存和內(nèi)存緩存)
* 異步下載并緩存
*
* @param url 圖片的URL
* @param placeholder 顯示在UIImageView上面的占位圖片,直到圖片下載完成
* @param options 下載圖片的選項。參考SDWebImageOptions的枚舉值
* @param progressBlock 下載的進度回調(diào)
* @param completedBlock 當(dāng)操作執(zhí)行完畢之后的回調(diào)。該回調(diào)沒有返回值
* 第一個參數(shù)為請求的圖片
* 第二個參數(shù)是NSError類型的,如果圖片下載成功則error為nil,否則error有值
* 第三個參數(shù)是圖片緩存的使用情況(內(nèi)存緩存|沙盒緩存|直接下載)
* 第四個參數(shù)是圖片的URL地址
*/
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;
//SDWebImageOptions的枚舉值:一般使用的是SDWebImageRetryFailed | SDWebImageLowPriority
typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
SDWebImageRetryFailed = 1 << 0,//下載失敗的時候會嘗試重新下載(默認(rèn))
SDWebImageLowPriority = 1 << 1,//如果正在UI交互階段會暫停下載(延遲下載)
SDWebImageCacheMemoryOnly = 1 << 2, //內(nèi)存中有緩存,沙河中沒有緩存
SDWebImageProgressiveDownload = 1 << 3, //如果設(shè)置的話,圖片顯示像瀏覽器顯示圖片一樣(由上往下有進度的顯示)
SDWebImageRefreshCached = 1 << 4, //將硬盤緩存交給系統(tǒng)自帶的NSURLCache去處理
SDWebImageContinueInBackground = 1 << 5, //回到后臺的時候還會繼續(xù)下載
SDWebImageHandleCookies = 1 << 6, // 通過設(shè)置NSMutableURLRequest.HTTPShouldHandleCookies = YES來處理存儲在NSHTTPCookieStore中的cookie
SDWebImageAllowInvalidSSLCertificates = 1 << 7,// 允許不受信任的SSL證書。主要用于測試目的。
SDWebImageHighPriority = 1 << 8, //優(yōu)先下載
SDWebImageDelayPlaceholder = 1 << 9, //延遲占位符
SDWebImageTransformAnimatedImage = 1 << 10,
SDWebImageAvoidAutoSetImage = 1 << 11 //改變動畫形象
};
- 下載圖片調(diào)用的主方法(進行磁盤緩存和內(nèi)存緩存)
/ **
* @param url 圖片的URL地址
* @param options 指定此次請求策略的選項
* @param progressBlock 圖片下載進度的回調(diào)
* @param completedBlock 操作完成后的回調(diào)
* 此參數(shù)是必須的,此block沒有返回值
* Image:請求的 UIImage,如果出現(xiàn)錯誤,image參數(shù)是nil
* error:如果出現(xiàn)錯誤,則error有值
* cacheType:`SDImageCacheType` 枚舉,標(biāo)示該圖像的加載方式
* SDImageCacheTypeNone:從網(wǎng)絡(luò)下載
* SDImageCacheTypeDisk:從本地緩存加載
* SDImageCacheTypeMemory:從內(nèi)存緩存加載
* finished:如果圖像下載完成則為YES,如果使用 SDWebImageProgressiveDownload 選項,同時只獲取到部分圖片時,返回 NO
* imageURL:圖片的URL地址
*
* @return SDWebImageOperation對象,應(yīng)該是SDWebimageDownloaderOperation實例
*/
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
options:(SDWebImageOptions)options
progress:(SDWebImageDownloaderProgressBlock)progressBloc
completed:(SDWebImageCompletionWithFinishedBlock)completedBlock;
- 如果我們只需要下載圖片,而不需要進行cache處理的時候,我們常常用另外一個類來達(dá)成效果:
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock;
- 播放Gif圖片
//傳入Gif圖像的名稱,得到一個可動畫的圖像
+ (UIImage *)sd_animatedGIFNamed:(NSString *)name;
//傳入Gif圖像的二進制數(shù)據(jù),得到一個可動畫的圖像
+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;
- 內(nèi)存警告處理
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
//1.清空緩存
//clearDisk:直接刪除緩存目錄下面的文件,然后重新創(chuàng)建空的緩存文件
//cleanDisk:刪除過期的文件數(shù)據(jù),計算當(dāng)前未過期的已經(jīng)下載的文件數(shù)據(jù)的大小,如果發(fā)現(xiàn)該數(shù)據(jù)大小大于我們設(shè)置的最大緩存數(shù)據(jù)大小,那么程序內(nèi)部會按照按文件數(shù)據(jù)緩存的時間從遠(yuǎn)到近刪除,直到小于最大緩存數(shù)據(jù)為止。
//過期時間:7天
[[SDWebImageManager sharedManager].imageCache clearDisk];
//2.取消當(dāng)前所有的操作
[[SDWebImageManager sharedManager] cancelAll];
}
SDWebImage 加載圖片的原理
- 顯示placeholderImage
- SDImageCache從緩存中查找圖片是否已經(jīng)下載
- 先從內(nèi)存圖片緩存查找是否有圖片
- 如果內(nèi)存中有圖片緩存,顯示圖片
- 如果內(nèi)存中沒有,生成NSInvocationOperation添加到執(zhí)行隊列開始從硬盤查找圖片緩存
- 如果硬盤中有,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過小,會先清空內(nèi)存緩存),顯示圖片
- 如果硬盤中沒有,說明該圖片沒有緩存,需要下載圖片,共享或重新生成一個下載器SDWebImageDownLoader開始下載圖片
- 開始圖片網(wǎng)絡(luò)請求,下載數(shù)據(jù)
- 數(shù)據(jù)下載完成后交給SDWebImageDecoder做圖片解碼
- 回調(diào)展示圖片
- 圖片保存到硬盤緩存和內(nèi)存緩存
- SDImageCache初始化會注冊一些通知,在內(nèi)存警告或退到后臺的時候清理內(nèi)存圖片緩存,應(yīng)用結(jié)束的時候清理過期圖片(圖片緩存周期是一周)
SDWebImage框架細(xì)節(jié)
-
SDWebImage內(nèi)部結(jié)構(gòu)
Snip20170522_14.png SDWebImage相關(guān)知識點補充
SDWebImage接收到內(nèi)存警告的時候如何處理?采用監(jiān)聽系統(tǒng)警告通知的方式處理,接收到警告后清空緩存
SDWebImage隊列最大并發(fā)數(shù)為6
SDWebImage內(nèi)部設(shè)置下載圖片超時時間為15m
SDWebImage圖片下載操作使用了NSURLConnection類發(fā)送網(wǎng)絡(luò)請求實現(xiàn)
圖片的下載順序,默認(rèn)是先進先出的
SDWebImage內(nèi)部如何判斷圖片類型?判斷該圖片二進制數(shù)據(jù)的第一個字節(jié)
+ (NSString *)sd_contentTypeForImageData:(NSData *)data;
-
SDWebImage做沙盒緩存時圖片的命名機制是拿到圖片的URL后直接對URL進行MD5加密。終端輸入:echo -n "url" |MD5
Snip20160221_38.png SDWebImage內(nèi)部使用NSCache類來進行緩存處理
NSCache是蘋果官方提供的緩存類,專門用來進行緩存處理,具體使用和NSDictionary類似,在AFN和SDWebImage框架中被使用來管理緩存
蘋果官方解釋NSCache在系統(tǒng)內(nèi)存很低時,會自動釋放對象(但模擬器演示不會釋放)建議:接收到內(nèi)存警告時主動調(diào)用removeAllObject方法釋放對象
NSCache是線程安全的,在多線程操作中,不需要對NSCache加鎖
NSCache的Key只是對對象進行Strong引用,不是拷貝
屬性介紹
@property (nullable, assign) id<NSCacheDelegate> delegate; //設(shè)置代理
@property (copy) NSString *name; //名稱
@property NSUInteger totalCostLimit; //緩存空間的最大總成本,超出上限會自動回收對象。默認(rèn)值為0,表示沒有限制
@property NSUInteger countLimit;//能夠緩存的對象的最大數(shù)量。默認(rèn)值為0,表示沒有限制
@property BOOL evictsObjectsWithDiscardedContent;//標(biāo)識緩存是否回收廢棄的內(nèi)容
- 方法介紹
- (void)setObject:(ObjectType)obj forKey:(KeyType)key;//在緩存中設(shè)置指定鍵名對應(yīng)的值,0成本
- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//在緩存中設(shè)置指定鍵名對應(yīng)的值,并且指定該鍵值對的成本,用于計算記錄在緩存中的所有對象的總成本,出現(xiàn)內(nèi)存警告或者超出緩存總成本上限的時候,緩存會開啟一個回收過程,刪除部分元素
- (void)removeObjectForKey:(KeyType)key;//刪除緩存中指定鍵名的對象
- (void)removeAllObjects;//刪除緩存中所有的對象
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;//代理方法,即將回收對象的時候調(diào)用該方法

