SDWebImage是目前非常流行的可用于發(fā)送網(wǎng)絡(luò)請(qǐng)求,加載圖片的三方框架。功能強(qiáng)大,使用簡(jiǎn)單。這里我們討論的不是SDWebImage加載圖片的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),而是在其基礎(chǔ)上進(jìn)一步封裝,站在用戶體驗(yàn)的角度上考慮如何加載圖片才能達(dá)到最佳用戶體驗(yàn)。
1.一款A(yù)PP,加載顯示圖片怎樣才能讓用戶有最佳的使用體驗(yàn)?zāi)兀?/h3>
根據(jù)手機(jī)網(wǎng)絡(luò)狀態(tài)的不同,站在用戶的角度上,應(yīng)該做好以下幾點(diǎn):
- ** 省錢:**能不用花自己錢的流量,就不用;不得不用時(shí),節(jié)約,盡量少用;免費(fèi)流量,大膽用。
- 優(yōu)質(zhì)畫面:在省錢,節(jié)約流量的前提下,盡量給用戶最佳的視覺(jué)體驗(yàn)。
2.SDWebImage加載圖片過(guò)程簡(jiǎn)單介紹
sd_setImageWithURL:placeholderImage:方法執(zhí)行步驟
- 1.取消當(dāng)前ImageView關(guān)聯(lián)的請(qǐng)求;
- 2.設(shè)置占位圖片到ImageView上去
- 3.如果緩存中有圖片就去緩存加載(緩存-->磁盤)
- 4.沒(méi)有就發(fā)送網(wǎng)絡(luò)請(qǐng)求給服務(wù)器,加載圖片
注意:該方法不是直接就去發(fā)送網(wǎng)絡(luò)請(qǐng)求給服務(wù)器,請(qǐng)求加載圖片的,在這之前會(huì)先去內(nèi)存和緩存中查看是否有現(xiàn)成的圖片,有就不會(huì)發(fā)送網(wǎng)絡(luò)請(qǐng)求。
3.根據(jù)網(wǎng)絡(luò)狀態(tài)我們?cè)撛鯓尤ゼ虞d圖片呢?

Snip20160723_2.png
4.上述過(guò)程的封裝
/**
* 根據(jù)網(wǎng)絡(luò)狀態(tài),加載對(duì)應(yīng)圖片
* @param oringinalImageUrl 原始圖片
* @param thumbnailImageURL 略縮圖
* @param palceHolderImage 占位圖片
* @param completedBlock 完成回調(diào)
*/
- (void)DKP_ImageWithOringinalImageURL:(NSString *)oringinalImageUrl thumbnailImageURL:(NSString *)thumbnailImageURL palceHolderImage:(UIImage *)placeholderImage completed:(SDWebImageCompletionBlock)completedBlock{
//查看沙盒中是否有原圖,有原圖顯示原圖,沒(méi)有原圖考慮下載
UIImage *bigImage =[[SDImageCache sharedImageCache]imageFromDiskCacheForKey:oringinalImageUrl];
if (bigImage) {//有原圖
[self sd_setImageWithURL:[NSURL URLWithString:oringinalImageUrl] placeholderImage:placeholderImage completed:completedBlock];
}else {//沒(méi)有原圖
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
if (manager.reachableViaWiFi) {//wifi,直接加載原圖
[self sd_setImageWithURL:[NSURL URLWithString:oringinalImageUrl] placeholderImage:placeholderImage completed:completedBlock];
}else if (manager.reachableViaWWAN) {//蜂窩網(wǎng)
BOOL alwaysLoadOriginalSource = YES;
# warning 這里是模擬的,真實(shí)情況需要去偏好設(shè)置查看用戶是怎么設(shè)置的
if (alwaysLoadOriginalSource) {//用戶設(shè)置總是加載原圖
[self sd_setImageWithURL:[NSURL URLWithString:oringinalImageUrl] placeholderImage:placeholderImage completed:completedBlock];
}else {//加載略縮圖
[self sd_setImageWithURL:[NSURL URLWithString:thumbnailImageURL] placeholderImage:placeholderImage completed:completedBlock];
}
}else {//沒(méi)網(wǎng)有略縮圖顯示略縮圖,沒(méi)有顯示占位圖
UIImage *smallImage =[[SDImageCache sharedImageCache]imageFromDiskCacheForKey:thumbnailImageURL];
if (smallImage) {//有略縮圖
[self sd_setImageWithURL:[NSURL URLWithString:thumbnailImageURL] placeholderImage:placeholderImage completed:completedBlock];
}else {//沒(méi)有略縮圖
[self sd_setImageWithURL:nil placeholderImage:placeholderImage completed:completedBlock];
}
}
}
}
今后,一步就能搞定根據(jù)網(wǎng)絡(luò)狀態(tài)加載圖片主的問(wèn)題
UIImageView *imageView = nil;//圖片顯示到ImageView上
NSString *bigPictureURL = nil;//大圖
NSString *smallPictureURL = nil;//小圖
UIImage *placeholder = nil;//占位圖
[imageView DKP_ImageWithOringinalImageURL:bigPictureURL thumbnailImageURL: smallPictureURL palceHolderImage: placeholder completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
//加載完成回調(diào)
}];