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

Snip20160723_2.png
4.上述過程的封裝
/**
* 根據(jù)網(wǎng)絡狀態(tài),加載對應圖片
* @param oringinalImageUrl 原始圖片
* @param thumbnailImageURL 略縮圖
* @param palceHolderImage 占位圖片
* @param completedBlock 完成回調(diào)
*/
- (void)DKP_ImageWithOringinalImageURL:(NSString *)oringinalImageUrl thumbnailImageURL:(NSString *)thumbnailImageURL palceHolderImage:(UIImage *)placeholderImage completed:(SDWebImageCompletionBlock)completedBlock{
//查看沙盒中是否有原圖,有原圖顯示原圖,沒有原圖考慮下載
UIImage *bigImage =[[SDImageCache sharedImageCache]imageFromDiskCacheForKey:oringinalImageUrl];
if (bigImage) {//有原圖
[self sd_setImageWithURL:[NSURL URLWithString:oringinalImageUrl] placeholderImage:placeholderImage completed:completedBlock];
}else {//沒有原圖
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 這里是模擬的,真實情況需要去偏好設置查看用戶是怎么設置的
if (alwaysLoadOriginalSource) {//用戶設置總是加載原圖
[self sd_setImageWithURL:[NSURL URLWithString:oringinalImageUrl] placeholderImage:placeholderImage completed:completedBlock];
}else {//加載略縮圖
[self sd_setImageWithURL:[NSURL URLWithString:thumbnailImageURL] placeholderImage:placeholderImage completed:completedBlock];
}
}else {//沒網(wǎng)有略縮圖顯示略縮圖,沒有顯示占位圖
UIImage *smallImage =[[SDImageCache sharedImageCache]imageFromDiskCacheForKey:thumbnailImageURL];
if (smallImage) {//有略縮圖
[self sd_setImageWithURL:[NSURL URLWithString:thumbnailImageURL] placeholderImage:placeholderImage completed:completedBlock];
}else {//沒有略縮圖
[self sd_setImageWithURL:nil placeholderImage:placeholderImage completed:completedBlock];
}
}
}
}
今后,一步就能搞定根據(jù)網(wǎng)絡狀態(tài)加載圖片主的問題
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)
}];