您的位置:首页 > 理论基础 > 计算机网络

iOS中根据网络环境显示不同图片

2016-04-18 15:28 507 查看

首先说一下怎么监听网络状态的改变

监听网络状态的改变可以使用苹果提供的Reachability来检测网络状态,也可以使用AFN框架来监听网络状态的改变.相比而言,我更推荐大家使用AFN来监听

如何使用AFN来监听网络状态的改变呢?

AFN框架中的AFNetworkReachabilityManager是专门用来监听网络状态的改变.可以点进去AFNetworkReachabilityManager的头文件中查看.使用十分简单.相信大家都看得懂.

用AFN来监听网络状态的改变是需要自己手动开启监听的.在项目中一般在AppDelegate的程序启动完毕的方法中开始监听网络状态的改变.
// 开启监听网络状态的改变(一定要使用单例对象)
[[AFNetworkReachabilityManager sharedManager] startMonitoring];


在开发中下载和显示图片,不用多说,当然首选的是SDWebImage框架了.

关于SDWebImage框架,如果你还不会用,那么你别和我说你做过iOS开发啊.

在项目中,为了提高用户的体验,往往都是要根据用户的网络环境不同,而显示不同的图片,以节省用户的流量.
伪代码:
if (缓存中有原图) {
显示原图
} else {
if (Wifi环境) {
下载显示原图
} else if (手机自带网络) {
if (偏好设置3G\4G环境下仍然下载原图) {
下载显示原图
} else {
下载显示小图
}
} else {
if (缓存中有小图) {
显示小图
} else {
显示占位图片
}
}
}


代码的封装(给UIImageView添加分类)

首先要用上面所讲的用AFN开启监听网络状态

/**
*  设置imageView显示的图片
*
*  @param OriginalImageURL  原图链接
*  @param thumbnailImageURL 小图链接
*  @param placeholderImage  占位图片
*  @param completedBlock    获取图片完成之后的回调block
*/
- (void)lxn_setImageWithOriginalImageURL:(NSString *)OriginalImageURL thumbnailImageURL:(NSString *)thumbnailImageURL placeholderImage:(UIImage *)placeholderImage completed:(SDWebImageCompletionBlock)completedBlock
{
// 判断下缓存中有没有高清的大图
UIImage *originalImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:OriginalImageURL];
if (originalImage) {    // 缓存中有高清大图
// 为什么要用这个方法设置图片呢?  因为这个方法设置图片会先取消这个对象的上一次网络请求, 防止因为图片下载慢的时候用户又滑动了屏幕而图片错位.  这个方法会先去缓存中找,没有找到才会继续下载
[self sd_setImageWithURL:[NSURL URLWithString:OriginalImageURL] placeholderImage:placeholderImage completed:completedBlock];
} else {    // 缓存中没有大图
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
if (manager.isReachableViaWiFi) { // WIFI下, 下载大图
[self sd_setImageWithURL:[NSURL URLWithString:OriginalImageURL] placeholderImage:placeholderImage completed:completedBlock];
} else if(manager.isReachableViaWWAN) {   // 3G/4G

BOOL alwaysDownloadOrinigalImage = [[NSUserDefaults standardUserDefaults] boolForKey:@"alwaysDownloadOrinigalImage"];
if (alwaysDownloadOrinigalImage) { // 设置了3G/4G环境下任然显示大图
[self sd_setImageWithURL:[NSURL URLWithString:OriginalImageURL] placeholderImage:placeholderImage completed:completedBlock];
} else {    // 下载小图
[self sd_setImageWithURL:[NSURL URLWithString:thumbnailImageURL] placeholderImage:placeholderImage completed:completedBlock];
}
} else {    // 没有网络
// 判断小图有没有缓存
UIImage *thumbnailImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:OriginalImageURL];
if (thumbnailImage) { // 显示小图
[self sd_setImageWithURL:[NSURL URLWithString:thumbnailImageURL] placeholderImage:placeholderImage completed:completedBlock];
} else { // 显示占位图片
[self sd_setImageWithURL:nil placeholderImage:placeholderImage completed:completedBlock];
}
}
}

}

补充

SDWebImage框架的
sd_setImageWithURL:placeholderImage:
方法的执行步骤

1.取消当前imageView之前关联的请求

2.设置占位图片到当前imageView上面

3.如果缓存中有对应的图片,那么就显示到当前imageView上面

文/李小南(简书作者)

原文链接:http://www.jianshu.com/p/d42dd6ccd682

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: