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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- okHttp框架的介绍 和关于https的自定义签名证书的问题
- Windows TCP连接数限制解决
- Android网络HttpURLConnection和HttpClient
- 神经网络学习笔记-问题记录(三)
- TCP/IP协议
- Http和Https的区别
- CentOS报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock32 error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
- <a target=_blank href=http://www.codeforge.cn/point/?recoid=1565262>CodeForge源码分享</a>
- POJ_1459_Power Network_网络流问题
- 深圳证券交易所网络投票业务指南
- 根据HttpSevletRequest 获取url 所有参数
- 阿里云ubuntu配置安装nginx,配置域名和HTTPS
- Win7提示诊断策略服务未运行无法诊断检查网络解决方法
- 计算机网络: 同步传输和异步传输(理解)
- 浅谈HTTP中Get与Post的区别
- 深度学习方法:受限玻尔兹曼机RBM(二)网络模型
- tomcat设置密码,访问 http://localhost:8080/manager/html,要密码
- cas系列(三)--HTTP和HTTPS、SSL
- http块指令解析以及存储
- hdu2732 网络流经典建图