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];
          } 
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM