zoukankan      html  css  js  c++  java
  • iOS学习笔记之Reachability简单使用

    写在前面

    在学习异步图片下载的Demo过程中,由于需要实时检测网路状态,因此用到了苹果提供的Reachability库。Reachability的功能包括:检测目标网络是否可用、检测当前网络的链接方式(2G、3G、Wifi)、检测网络连接的变更。

    使用准备

    看网上说Reachability有两个版本,一个是苹果官方的,一个是Andrew W. Donoho 改进过后的,我主要使用的还是官方的版本,下载地址如下:
    https://developer.apple.com/library/ios/samplecode/Reachability/Listings/Reachability_main_m.html
    下载完后在自己的项目中导入Reachability.h/m,然后就可用开始使用了。

    使用简介

    1、在控制器中注册网络状态改变的通知

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        //监测网络情况
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(reachabilityChanged:)
                                                     name: kReachabilityChangedNotification
                                                   object: nil]; 
        //初始化Reachability类,并添加一个监测的网址。
        Reachability *hostReach = [Reachability reachabilityWithHostName:@"www.baidu.com"];
        //开始监测
        [hostReach startNotifier];
    }
    

    2、在控制器中编写接收到通知后的处理事件

    - (void)reachabilityChanged:(NSNotification *)note {
        Reachability* curReach = [note object];
        NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
        NetworkStatus status = [curReach currentReachabilityStatus];
        
        //判断网络状体,无网络弹窗提示
        if (status == NotReachable)
        {
            [SVProgressHUD showWithStatus:@"无网络"];
        }
        //有网络进入界面初始化
        else
        {
            NSLog(@"有网络");
            [SVProgressHUD dismiss];
            [self initSubviews];
        }
    }
    

    3、在控制器中移除通知观察者

    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    

    写在后面

    以上几个步骤就是Reachability的整个使用流程。需要注意的是,Reachability这个库的通知事件有时会被触发两次。比如在联网状态下进入应用,“有网络”这句log可能会打印两次,并且这种情况发生的频率挺高的。通过查找资料(主要是在stack overflow上)和多次测试,证实了这个事实。为了避免initSubviews方法被执行多次,可以考虑加入一个通知计数器,当计数器为1时才执行初始化流程,部分代码如下:
    声明通知计数器并初始化

    static int countNoti = 0;
    

    通知处理事件

     //判断网络状体,无网络弹窗提示
        if (status == NotReachable)
        {
            [SVProgressHUD showWithStatus:@"无网络"];
        }
        //有网络进入界面初始化
        else
        {
              countNoti++;
              [SVProgressHUD dismiss];
      
              //防止通知事件处理多次
              if (countNoti == 1)
              {
                  NSLog(@"有网络");
                  [SVProgressHUD dismiss];
                  [self initSubviews];
              } 
        }
    
  • 相关阅读:
    USACO 2021 US Open
    【UR #20】跳蚤电话
    省选前的做题记录
    PE444
    杂题
    CF1190E
    gym100299E
    杂题
    2021 5 10 团队博客
    2021 5 9 团队博客
  • 原文地址:https://www.cnblogs.com/scut-linmaojiang/p/iOS-Reachability.html
Copyright © 2011-2022 走看看