SDWebImage是目前非常流行的可用于发送网络请求,加载图片的三方框架。功能强大,使用简单。这里我们讨论的不是SDWebImage加载图片的内部实现细节,而是在其基础上进一步封装,站在用户体验的角度上考虑如何加载图片才能达到最佳用户体验。
1.一款APP,加载显示图片怎样才能让用户有最佳的使用体验呢?
根据手机网络状态的不同,站在用户的角度上,应该做好以下几点:
- ** 省钱:**能不用花自己钱的流量,就不用;不得不用时,节约,尽量少用;免费流量,大胆用。
- 优质画面:在省钱,节约流量的前提下,尽量给用户最佳的视觉体验。
2.SDWebImage加载图片过程简单介绍
sd_setImageWithURL:placeholderImage:方法执行步骤
- 1.取消当前ImageView关联的请求;
- 2.设置占位图片到ImageView上去
- 3.如果缓存中有图片就去缓存加载(缓存-->磁盘)
- 4.没有就发送网络请求给服务器,加载图片
注意:该方法不是直接就去发送网络请求给服务器,请求加载图片的,在这之前会先去内存和缓存中查看是否有现成的图片,有就不会发送网络请求。
3.根据网络状态我们该怎样去加载图片呢?
4.上述过程的封装
/**
* 根据网络状态,加载对应图片
* @param oringinalImageUrl 原始图片
* @param thumbnailImageURL 略缩图
* @param palceHolderImage 占位图片
* @param completedBlock 完成回调
*/
- (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) {//蜂窝网
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 {//没网有略缩图显示略缩图,没有显示占位图
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];
}
}
}
}
今后,一步就能搞定根据网络状态加载图片主的问题
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) {
//加载完成回调
}];