美文网首页iOS开发好文iOSJZ专题
iOS中根据网络环境显示不同图片(干货)

iOS中根据网络环境显示不同图片(干货)

作者: 李小南 | 来源:发表于2016-04-17 22:04 被阅读1554次

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

监听网络状态的改变可以使用苹果提供的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上面

相关文章

  • iOS中根据网络环境显示不同图片(干货)

    首先说一下怎么监听网络状态的改变 监听网络状态的改变可以使用苹果提供的Reachability来检测网络状态,也可...

  • iOS实录17:网络图片的优化显示

    iOS实录17:网络图片的优化显示 iOS实录17:网络图片的优化显示

  • Localization 国际化

    iOS中什么是国际化? 根据系统不同的语言环境显示相应的语言内容。 iOS中如何为工程添加国际化功能 comman...

  • 根据网络环境来加载图片

    网络环境wifi使用高清图,流量使用缩略图 一进来,wifi环境,通过sd下载大图,存入沙盒,当再次使用切换为流量...

  • 真机上下黑边

    iOS真机启动图不显示 上下黑边有黑边 根据不同机型对应响应图片尺寸。 解决方案: 1.检查图片尺寸是否正确。 2...

  • NSLocalizedString

    参考文档1参考文档2参考文档3 有些时候应用需要根据系统语言环境显示不同语言的字符,或不同的图片,或不同的应用名称...

  • Flutter图片加载

    Flutter中,通过Image组件来加载并显示图片,可以从asset、文件、内存以及网络获取图片,都需要实现不同...

  • 图片设置level-list,根据不同状态显示不同图片

    前言:工作需求,wifi图标根据不同的强度,显示不同的状态.于是想到用图层的方法 bg.xml note:andr...

  • ReactNative入门之iOS Image无法显示http图

    准备入门ReactNative, 写了个Image显示网络图片的 运行在iOS模拟器上,无法显示图片,2种解决方案...

  • iOS移动网络抓包

    背景 目前app应用会针对不同的网络环境,给予不同资源大小,如Wi-Fi网络环境的图片资源为高清;4G网络图片资源...

网友评论

  • catYuan:小图链接 怎么获取 ? 一般我们都是一个图片地址。 :smiley:
    逍遥jc:@catYuan 服务端返回不同像素的图片地址,地址就是一串字符,增加不了多少开销的,但是在用户体验上,能提升几百个等级
    catYuan:@李小南 这样啊,没有就不用考虑了呗。知道了。
    李小南:@catYuan 一般都是后台提供的啊.如果没有的话,就没有办法了啊.
  • 82f1ad79875f:学习了

本文标题:iOS中根据网络环境显示不同图片(干货)

本文链接:https://www.haomeiwen.com/subject/bggolttx.html