
前言:在我們?nèi)粘5拈_(kāi)發(fā)中我們通常會(huì)使用SDWebImage來(lái)實(shí)現(xiàn)UIImageView加載來(lái)自互聯(lián)網(wǎng)的遠(yuǎn)程圖片
官方介紹:一個(gè)具有緩存支持的異步映像下載程序
關(guān)鍵詞:緩存、異步
一:SDWebImage安裝說(shuō)明:
安裝方式兩種
1、直接cocoapods安裝 在文件夾生成的podfile文件中添加pod 'SDWebImage' 終端cd + 文件位置 然后pod install即可.
2、直接下載SDWebImage,然后將文件夾拖拽到本地項(xiàng)目即可.
SDWebImage的github:https://github.com/rs/SDWebImage
二:功能簡(jiǎn)介
1、一個(gè)添加了web圖片加載和緩存管理的UIImageView分類
2、一個(gè)異步圖片下載器
3、一個(gè)異步的內(nèi)存加磁盤(pán)綜合存儲(chǔ)圖片并且自動(dòng)處理過(guò)期圖片
4、支持動(dòng)態(tài)gif圖
5、支持webP格式的圖片
6、后臺(tái)圖片解壓處理
7、確保同樣的圖片url不會(huì)下載多次
8、確保偽造的圖片url不會(huì)重復(fù)嘗試下載
9、確保主線程不會(huì)阻塞
三:SDWebImage實(shí)現(xiàn)緩存的步驟

1、當(dāng)我們需要獲取網(wǎng)絡(luò)圖片的時(shí)候,我們首先需要的便是URL,獲得URL后我們SDWebImage實(shí)現(xiàn)的并不是直接去請(qǐng)求網(wǎng)路,而是檢查圖片緩存中有沒(méi)有和URl相關(guān)的圖片,如果有則直接返回image,如果沒(méi)有則進(jìn)行下一步。
2、當(dāng)圖片緩存中沒(méi)有圖片時(shí),SDWebImage依舊不會(huì)直從網(wǎng)絡(luò)上獲取,而是檢查沙盒中是否存在圖片,如果存在,則把沙盒中對(duì)應(yīng)的圖片存進(jìn)image緩存中,然后按著第一步的判斷進(jìn)行。
3、如果沙盒中也不存在,則顯示占位圖,然后根據(jù)圖片的下載隊(duì)列緩存判斷是否正在下載,如果下載則等待,避免二次下載。如果不存則創(chuàng)建下載隊(duì)列,下載完畢后將下載操作從隊(duì)列中清除,并且將image存入圖片緩存中。!
4、刷新UI(當(dāng)然根據(jù)實(shí)際情況操作)將image存入沙盒緩存。
四:SDWebImage基本使用
1、下載圖片并顯示(內(nèi)存緩存&磁盤(pán)緩存)
1、下載圖片并顯示(內(nèi)存緩存&磁盤(pán)緩存)
/*
第一個(gè)參數(shù):圖片的url地址
第二個(gè)參數(shù):設(shè)置的占位圖片
*/
[self.headIcon sd_setImageWithURL:[NSURL URLWithString:topicItem.profile_image]
placeholderImage:[[UIImage imageNamed:@"defaultUserIcon"] circleImage]
completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
self.headIcon.image = [image circleImage] ;
}] ;
2、下載圖片顯示并計(jì)算下載進(jìn)度(內(nèi)存緩存&磁盤(pán)緩存&下載進(jìn)度)
-(void)download
{ /*
第一個(gè)參數(shù):圖片的url地址
第二個(gè)參數(shù):設(shè)置的占位圖片
第三個(gè)參數(shù):下載圖片選項(xiàng)(策略)
第四個(gè)參數(shù):進(jìn)度回調(diào)block
receivedSize:已經(jīng)下載的數(shù)據(jù)大小
expectedSize:圖片的總大小
第五個(gè)參數(shù):completed圖片下載結(jié)束回調(diào)(成功|失?。? image:下載后得到的圖片,如果下載失敗,那么image的值為nil
error:錯(cuò)誤信息,如果失敗,則error有值
cacheType:圖片來(lái)源(枚舉:內(nèi)存緩存|磁盤(pán)緩存|直接下載)
imageURL:下載圖片的url
*/
[self.imageView sd_setImageWithURL:[NSURL URLWithString:topicItem.gifFistFrame] placeholderImage:[UIImage imageNamed:@"imageBackground"] options:SDWebImageProgressiveLoad progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
if (!expectedSize) return ;
topicItem.pictureProgress = 1.0 * receivedSize / expectedSize ;
//進(jìn)度是在子線程中完成的 所以要回到主線程
dispatch_async(dispatch_get_main_queue(), ^{
[self.progressView setProgress:topicItem.pictureProgress animated:YES] ;
}) ;
} completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
// [self.progressView performAction:M13ProgressViewActionSuccess animated:YES];
self.progressView.hidden = YES ;
switch (cacheType) {
case SDImageCacheTypeNone:
NSLog(@"直接下載");
break;
case SDImageCacheTypeDisk:
NSLog(@"磁盤(pán)緩存");
break;
case SDImageCacheTypeMemory:
NSLog(@"內(nèi)存緩存");
break;
default:
break;
}
// NSLog(@"當(dāng)前是非WIFI狀態(tài)下,動(dòng)圖不會(huì)自動(dòng)播放") ;
}] ;