SDWebImage的常用方法
-
下載圖片并顯示
同時做內(nèi)存緩存和磁盤緩存
圖片加載結(jié)束之后, 在本地磁盤緩存會對圖片名稱進(jìn)行一次MD5加密
再圖片加載完成之前, 可以使用
placeholder
來作為占位圖片: 目前APP通用的方法-
弊端: 如果加載過多的圖片, 會占用過多的內(nèi)存, 因此要監(jiān)聽當(dāng)前內(nèi)存, 當(dāng)內(nèi)存占用過多主動釋放
[self.imageView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"baiduIcon.png""]];
-
下載圖片并計算下載進(jìn)度
使用UIImageView的分類下載, 下載后會自動設(shè)置給UIIMageView
同時做內(nèi)存緩存和磁盤緩存
-
添加了進(jìn)度回調(diào)和完成回調(diào)
- 進(jìn)度回調(diào)中可以監(jiān)聽到當(dāng)前的下載進(jìn)度, 可用于做一些指示性操作
- 完成回調(diào)可以在圖片下載完畢之后, 執(zhí)行一些操作
-
options: 這個參數(shù)可以設(shè)置下載圖片的策略(對優(yōu)化程序很重要), 在下面詳細(xì)介紹
[self.imageView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"baiduIcon.png"] options:SDWebImageProgressiveDownload progress:^(NSInteger receivedSize, NSInteger expectedSize) { // receivedSize: 已經(jīng)下載的數(shù)據(jù)的大小 // expectedSize: 圖片的總大小 NSLog(@"%f",1.0 * receivedSize/expectedSize); } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { // 下載完成后會自動回到主線程 NSLog(@"%@",[NSThread currentThread]); switch (cacheType) { case SDImageCacheTypeNone: NSLog(@"直接下載, 不做緩存"); break; case SDImageCacheTypeDisk: NSLog(@"磁盤緩存"); break; case SDImageCacheTypeMemory: NSLog(@"內(nèi)存緩存"); break; default: break; } }];
}
-
使用SDWebImageManager單例下載
同時做內(nèi)存緩存和圖片緩存
可以監(jiān)聽下載進(jìn)度
-
下載圖片后需要在Block回調(diào)中自行設(shè)置圖片
[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:@"http://www.baidubg.jpg"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { NSLog(@"%f", 1.0 * receivedSize / expectedSize); } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { // 設(shè)置圖片 NSLog(@"%@", [NSThread currentThread]); self.imageView.image = image; NSLog(@"%@", [NSThread currentThread]); }];
-
使用SDWebImageDownloader類來下載
downloader類, 只負(fù)責(zé)下載圖片, 并不會去做任何的緩存
-
注意這里的Block回調(diào), 是在子線程中進(jìn)行的
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:@"http://www.baidubg.jpg"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { NSLog(@"%f", 1.0 * receivedSize / expectedSize); } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { // 回到主線程中設(shè)置圖片 dispatch_async(dispatch_get_main_queue(), ^{ self.imageView.image = image; }); }];
-
加載GIF圖片的方法
該方法專用于加載GIF圖片, 并且也會做緩存
此方法為UIImage的分類
注意他會對過大的圖片進(jìn)行一次壓縮處理
-
平時使用
sd_setImgae..
方法也可以加載GIF圖片self.imageView.image = [UIImage sd_animatedGIFNamed:@"test"];
補充options的參數(shù):
- SDWebImageRetryFiled(失敗重試)
- SDWebImage在默認(rèn)情況下, 如果某個URL失效無法下載, 那么SDWebImage就會將這個URL加入到一個黑名單中, 并且不會再次嘗試去下載
- SDWebImageLowPriority(低優(yōu)先級)
- 在默認(rèn)情況下, 下載任務(wù)和UI交互之間, 是同時進(jìn)行的; 如果選擇這個設(shè)置, 那么系統(tǒng)會優(yōu)先進(jìn)行UI交互, 之后再去下載圖片
- SDWebImageCacheMemoryOnly(內(nèi)存緩存)
- 對于下載的圖片, 只做內(nèi)存緩存, 不做磁盤緩存(適用于一次展示類的圖片)
- SDWebImageProgressiveDownload(漸進(jìn)式下載)
- 默認(rèn)情況下, 圖片只有全部下載完成之后才可以顯示; 這個設(shè)置可以讓圖片漸變式顯示, 可以設(shè)置一些逐層刷新的效果
- SDWebImageRefreshCached(重新緩存)
- 此選項一般很少用, 算是一個詭異但是比較高級的用法, 筆者從來沒用過.....
- 該方法即使你的圖片已經(jīng)緩存到磁盤了, 但是還是會重新緩存圖片, 主要用做對同一個URL資源, 加載的可能是不同的圖片, 就需要使用此方法
- SDWebImageContinueInBackground(后臺加載)
- 當(dāng)你的App退出到后臺時, 對于沒有下載完成的下載任務(wù), 會向系統(tǒng)額外請求一點時間繼續(xù)下載圖片, 但是如果系統(tǒng)分配的時間已到, 下載就會被取消.
- 同上, 沒用過, 因為我們應(yīng)該盡量避免當(dāng)App進(jìn)入后臺也要耗費流量的情況
- SDWebImageHandleCookies(Cookies緩存)
- 這個完全不知道怎么用, 應(yīng)該是瀏覽器App使用的選項吧
- SDWebImageAllowInvalidSSLCertificates(允許未信任的證書)
- 可以在未被信任的證書網(wǎng)站中下載, 一般用于測試
- SDWebImageHighPriority(高優(yōu)先級)
- 確保圖片在第一時間被加載, 移動到隊列最前方
- 對于個別需要盡快展示給用戶的圖片, 使用此方法
- SDWebImageDelayPlaceholder(推遲占位圖片)
- 默認(rèn)情況下, 會先顯示出占位圖片, 然后再去加載圖片
- 此設(shè)置會先去加載圖片, 加載完畢后再顯示占位圖片(詭異的用法)
- SDWebImageTransformAnimatedImage(未使用過)
- 沒用過這個設(shè)置, 并且SDWebImage也不推薦使用
- SDWebImageAvoidAutoSetImage(手動管理緩存)
- 該設(shè)置會在加載圖片完畢后, 在completion回調(diào)方法中, 由開發(fā)者自行處理圖片緩存