今天和大家一起來學習一下SDWebImage的基本使用,有疏忽的地方,還望各位不吝賜教。
一、SDWebImage的簡介
之前簡單地實現(xiàn)了iOS圖片加載,可以看到流程很復雜,而且需要注意的地方很多,本篇來介紹一個加載圖片的第三方SDWebImage,將一些基本的使用方式和實現(xiàn)過程也做一個簡單地分析。關于導入SDWebImage我就不做贅述了,小伙伴們自己去添加吧!
二、《iOS圖片加載策略的簡單實現(xiàn)》使用SDWebImage實現(xiàn)
/* 如果我們采用SDWebImage來進行《iOS圖片加載策略的簡單實現(xiàn)》文章中的設置圖標,你只要下面這幾行代碼。
* 這個方法是最復雜的,其他的小伙伴們按照這個比照就行了。
* 第一個參數(shù):下載圖片的url地址
* 第二個參數(shù):占位圖片
* 第三個參數(shù):progress 進度回調
* receivedSize 已經下載的數(shù)據(jù)大小
* expectedSize 要下載的圖片的總大小
* 第四個參數(shù):completed回調
* image 要下載的圖片
* error 錯誤信息
* cacheType 緩存類型
SDImageCacheTypeNone, //不使用 SDWebImage 緩存,從網(wǎng)絡下載
SDImageCacheTypeDisk, //使用磁盤緩存
SDImageCacheTypeMemory //使用內存緩存
* imageURL 圖片url
*
* 忘記了一個參數(shù):options 使用0表示采用默認方法
SDWebImageRetryFailed = 1 << 0, //失敗后嘗試重新下載
SDWebImageLowPriority = 1 << 1, //低優(yōu)先級
SDWebImageCacheMemoryOnly = 1 << 2, //只使用內存緩存
SDWebImageProgressiveDownload = 1 << 3, //漸進式下載
SDWebImageRefreshCached = 1 << 4, //刷新緩存
SDWebImageContinueInBackground = 1 << 5, //后臺下載
SDWebImageHandleCookies = 1 << 6, //處理保存在NSHTTPCookieStore中的cookies
SDWebImageAllowInvalidSSLCertificates = 1 << 7, //允許不信任的 SSL 證書
SDWebImageHighPriority = 1 << 8, //高優(yōu)先級(優(yōu)先下載)
SDWebImageDelayPlaceholder = 1 << 9, //延遲占位圖片
SDWebImageTransformAnimatedImage = 1 << 10, //轉換動畫圖像
SDWebImageAvoidAutoSetImage = 1 << 11 //手動設置圖像
*/
NSURL *url = [NSURL URLWithString:item.icon];
[cell.imageView sd_setImageWithPreviousCachedImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeHolder.png"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
// 是使用的哪里的圖片,下載的,內存的還是沙盒的
NSLog(@"cacheType------%ld",(long)cacheType);
}];
三、SDWebImage的基本使用
1、下載圖片且需要獲得下載進度 默認內存緩存&磁盤緩存都做了
[self.iconImageView sd_setImageWithPreviousCachedImageWithURL:[NSURL URLWithString:@" 下載圖片的路徑"]placeholderImage:[UIImage imageNamed:@"icon"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
switch (cacheType) {
case SDImageCacheTypeNone:
NSLog(@"SDImageCacheTypeNone");
break;
case SDImageCacheTypeDisk:
NSLog(@"SDImageCacheTypeDisk");
break;
case SDImageCacheTypeMemory:
NSLog(@"SDImageCacheTypeMemory");
break;
default:
NSLog(@"default");
break;
}
}];
2、簡單獲得一張圖片,不進行一些其他設置
// 這個是最核心的方法,上面的方法調用的就是這個方法
[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:@"下載圖片的路徑"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
NSLog(@"%f",1.0 * receivedSize / expectedSize);
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
// finished:如果圖像下載完成則為YES,如果使用
self.iconImageView.image = image;
}];
3、沒有做任何緩存操作
// data:圖片的二進制數(shù)據(jù)
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:@"下載圖片的路徑"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
} completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
// 且block是在子線程中執(zhí)行的 要和主線程進行通信
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.iconImageView.image = [UIImage imageWithData:data];
}];
}];
4、設置gif圖片
self.iconImageView.image = [UIImage sd_animatedGIFNamed:@"gif圖片的下載路徑"];
5、內存清空
// 在AppDelegate中進行操作 因為在很多控制器你可能都用到了,所以在這里做
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
// 1、清空緩存
// cleanDisk : 清除過期的緩存,計算當前的緩存大小,和設置的最大緩存數(shù)量進行比對,如果依然超過那么繼續(xù)刪除(按照創(chuàng)建時間的先后順序進行刪除)
// clearDisk : 直接刪除,重新創(chuàng)建
// 過期時間:7天 在SDWebImageCache文件中可以找到對應的屬性
// [[SDWebImageManager sharedManager].imageCache cleanDisk];
[[SDWebImageManager sharedManager].imageCache clearDisk];
// 2、取消當前所有的操作
[[SDWebImageManager sharedManager] cancelAll];
}
四、SDWebImage的內部介紹
/*
* SDWebImageManager 分為兩部分
* 一部分是用來處理圖片緩存的SDImageCache
* 還有一部分是處理下載的類SDWebImageDownloader 但是圖片的下載方法真正的實現(xiàn)在其子類中SDWebImageDownloaderOpertion
* 1、最大并發(fā)數(shù)量
maxConcurrentDownloads 設置并發(fā)下載數(shù),默認為6
* 2、緩存文件的保存名稱如何處理 將url進行MD5加密后最為緩存圖片的名稱 下面這個命令可以直接在終端中得到md5加密的圖片路徑
echo -n "下載圖片的路徑" |md5
* 3、該框架內部對于內存警告的處理方式
監(jiān)聽到UIApplicationDidReceiveMemoryWarningNotification(應用程序發(fā)生內存警告)通知后,調用removeAllObjects方法
通過監(jiān)聽通知的方式進行內存的清理操作。
* 4、該框架進行緩存處理的方式
NSCache
* 5、如何判斷圖片的類型
NSData+ImageContentType.h 在判斷圖片類型的時候,只匹配第一個字節(jié)就可以判斷
* 6、隊列中任務的處理方式
SDWebImageDownloaderExecutionOrder 下載的順序 默認SDWebImageDownloaderFIFOExecutionOrder 先進先出
* 7、如何下載圖片的?
發(fā)送請求下載圖片 使用NSURLConnection 當然在iOS7.0之后都改成了NSURLSession
* 8、請求超時的時間默認是15秒
*/
五、結合NSCache繼續(xù)優(yōu)化
結合NSCache繼續(xù)進行《iOS圖片加載策略的簡單實現(xiàn)》中的實現(xiàn)的優(yōu)化,關于NSCache的使用大家直接去看我的《iOS緩存策略——NSCache的簡單使用》,好吧這篇文章已經跑偏了。說到這里我們就把SDWebImage簡單的描述完了,雖然也沒說到啥,筆者能力有限,關于SDWebImage還會繼續(xù)學習的。
/** 內存緩存 */
@property (nonatomic, strong) NSCache *images;
// 懶加載實現(xiàn)
- (NSCache *)images{
if (!_images) {
_images = [[NSCache alloc] init];
// 能夠緩存圖片的最大數(shù)量。默認值為0,表示沒有限制。
_images.countLimit = 4;
}
return _images;
}