寫在前面
在學習異步圖片下載的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];
}
}