#import "ViewController.h" #import "UIImageView+WebCache.h" #import "SDWebImageManager.h" #import "SDWebImageDownloader.h" #import "UIImage+GIF.h" #import "NSData+ImageContentType.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self download]; } //1.下載圖片且需要獲取下載進度 /** * 1:當需要獲取下載進度的時候可以使用此方法,其中optiobs如果什么都不做,可以傳參數0,optiobs是一個位移枚舉,可以通過按位或 | 來並列添加參數 2:SDImageCacheType緩存的類型:此方法默認做了內存緩存,與磁盤緩存,第一次是直接下載,然后點擊的時候是從內存緩存中讀取,當內存緩存不存在的時候,再從磁盤緩存讀取 * */ //內存緩存&磁盤緩存 -(void)download { [self.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.600_0.jpeg"] placeholderImage:[UIImage imageNamed:@"Snip20160221_306"] options:SDWebImageCacheMemoryOnly | SDWebImageProgressiveDownload progress:^(NSInteger receivedSize, NSInteger expectedSize) { } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { switch (cacheType) { case SDImageCacheTypeNone: NSLog(@"直接下載"); break; case SDImageCacheTypeDisk: NSLog(@"磁盤緩存"); break; case SDImageCacheTypeMemory: NSLog(@"內存緩存"); break; default: break; } }]; NSLog(@"%@",[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]); } //2.只需要簡單獲得一張圖片,不設置 /** * 1:默認SDImageCacheType是內存緩存&磁盤緩存。如果只是簡單下載一張圖片,就用如下的方法:[SDWebImageManager sharedManager] downloadImageWithURL * */ -(void)download2 { [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.600_0.jpeg"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { NSLog(@"%f",1.0 * receivedSize / expectedSize); } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { //得到圖片 self.imageView.image = image; }]; } //3.不需要任何的緩存處理 /** * 沒有做任何緩存處理 * */ -(void)download3 { //data:圖片的二進制數據 [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.600_0.jpeg"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { [[NSOperationQueue mainQueue]addOperationWithBlock:^{ self.imageView.image = image; }]; }]; } //4.播放Gif圖片 /** *播放Gif圖片 */ -(void)gif { NSLog(@"%s",__func__); //self.imageView.image = [UIImage imageNamed:@"39e805d5ad6eddc4f80259d23bdbb6fd536633ca"]; UIImage *image = [UIImage sd_animatedGIFNamed:@"39e805d5ad6eddc4f80259d23bdbb6fd536633ca"]; self.imageView.image = image; } -(void)type { NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/Snip20160221_306.png"]; NSString *typeStr = [NSData sd_contentTypeForImageData:imageData]; NSLog(@"%@",typeStr); } @end
二:當內存產生警告的時候,清除緩存
#import "AppDelegate.h" #import "SDWebImageManager.h" @interface AppDelegate () @end @implementation AppDelegate -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application { //1.清空緩存 //clear:直接刪除緩存目錄下面的文件,然后重新創建空的緩存文件 //clean:清除過期緩存,計算當前緩存的大小,和設置的最大緩存數量比較,如果超出那么會繼續刪除(按照文件了創建的先后順序) //過期時間:7天 [[SDWebImageManager sharedManager].imageCache clearMemory]; //2.取消當前所有的操作 [[SDWebImageManager sharedManager] cancelAll]; //3.最大並發數量 == 6 //4.緩存文件的保存名稱如何處理? 拿到圖片的URL路徑,對該路徑進行MD5加密 //5.該框架內部對內存警告的處理方式? 內部通過監聽通知的方式請你緩存 //6.該框架進行緩存處理的方式:可變字典--->NSCache //7.如何判斷圖片的類型: 在判斷圖片類型的時候,只匹配第一個字節 //8.隊列中任務的處理方式:FIFO //9.如何下載圖片的? 發送網絡請求下載圖片,NSURLConnection //10.請求超時的時間 15秒 //[NSData dataWithContentsOfURL:<#(nonnull NSURL *)#>] } @end
三:SDWebImage的結構:最頂層的父類是SDWebImageManager,其下有兩個子類如圖所示
四:知識點總結:
01 設置imageView的圖片 [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:[UIImage imageNamed:@"placehoder"]]; 02 設置圖片並計算下載進度 //下載並設置圖片 /* 第一個參數:要下載圖片的url地址 第二個參數:設置該imageView的占位圖片 第三個參數:傳一個枚舉值,告訴程序你下載圖片的策略是什么 第一個block塊:獲取當前圖片數據的下載進度 receivedSize:已經下載完成的數據大小 expectedSize:該文件的數據總大小 第二個block塊:當圖片下載完成之后執行該block中的代碼 image:下載得到的圖片數據 error:下載出現的錯誤信息 SDImageCacheType:圖片的緩存策略(不緩存,內存緩存,沙盒緩存) imageURL:下載的圖片的url地址 */ [cell.imageView sd_setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:[UIImage imageNamed:@"placehoder"] options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) { //計算當前圖片的下載進度 NSLog(@"%.2f",1.0 *receivedSize / expectedSize); } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { }]; 03 系統級內存警告如何處理(面試) //取消當前正在進行的所有下載操作 [[SDWebImageManager sharedManager] cancelAll]; //清除緩存數據(面試) //cleanDisk:刪除過期的文件數據,計算當前未過期的已經下載的文件數據的大小,如果發現該數據大小大於我們設置的最大緩存數據大小,那么程序內部會按照按文件數據緩存的時間從遠到近刪除,知道小於最大緩存數據為止。 //clearMemory:直接刪除文件,重新創建新的文件夾 //[[SDWebImageManager sharedManager].imageCache cleanDisk]; [[SDWebImageManager sharedManager].imageCache clearMemory]; 04 SDWebImage默認的緩存時間是1周 05 如何播放gif圖片 /* 5-1 把用戶傳入的gif圖片->NSData 5-2 根據該Data創建一個圖片數據源(NSData->CFImageSourceRef) 5-3 計算該數據源中一共有多少幀,把每一幀數據取出來放到圖片數組中 5-4 根據得到的數組+計算的動畫時間-》可動畫的image [UIImage animatedImageWithImages:images duration:duration]; */ 06 如何判斷當前圖片類型,只判斷圖片二進制數據的第一個字節 + (NSString *)sd_contentTypeForImageData:(NSData *)data; 07 內部如何進行緩存處理?使用了NSCache類,使用和NSDictionary類似 08 沙盒緩存圖片的命名方式為對該圖片的URL進行MD5加密 echo -n "url" |MD5 09 當接收到內存警告之后,內部會自動清理內存緩存 10 圖片的下載順序,默認是先進先出的:FIFO原則