这个问题困扰我有两天,知道我对KVO有所了解,知道今天我才解决这个难题。接下来我就介绍一下我是怎么解决的。可能不是最好的,欢迎看到这片博客给出更好的意见。
在开始之前我们首先要将Reachability导入到工程中,注意,这个文件不是采用的ARC管理,所以我们要做下手动适配。其实也不是什么高科技。如图
添加的内容 -fno-objc-arc
,这里主要是为了让其适配ARC工程。这里的话多说一句,一般大家是用不到这个,如果在MRC工程下兼容ARC模式的添加的代码是 -fobjc-arc
。同样这里也没有什么特殊的意义,就是简单的是适配而已。
完成了上述事情之后,我们就可以开始我们的正事了。首先我们在这里说明一下我的思路。
1.为网络状态添加观察者。
2.实现观察者触发的动作。
忽然发现好简单啊,想当初为啥没搞出来的
首先我们给网络状态添加观察者,代码如下:
- (void)monitorNetWorkStatus{
//创建对象 通过不断的对百度的地址来检测状态
Reachability *reach = [Reachability reachabilityWithHostname:@"www.baidu.com"];
//2.注册通知 监听网络状态
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
//3.触发通知
[reach startNotifier];
}
这里我说明一下为啥ping百度的主机,其实吧,我就是觉得顺手而已,没有其他意义,如果让我自己选,我更愿意pingwww.google.com
. 特别说一下,本人没有研究reachability的实现机制,至于更ping得原理是否一样,我并不确定,作者只是觉得两者很想就这样说了。作者是一个很随性的人,这点事情不要太纠结。染就说来的童鞋,接的私信我。
完成了上述时间之后 我们接下里实现通知触发的动作代码如下:
- (void)reachabilityChanged:(NSNotification *)center {
//获得reachability
Reachability *reach = [center object];
if ([reach isReachable]) {
NSLog(@"网络正常");
} else {
NSLog(@"网络异常");
}
}
这是目前我实现的思路,如果有更好的童鞋,记得私信告诉啊,亲测在XCode 7.2 iOS9.2下运行没问题。
结束语:
目前这个方法的实现循环监听有个明显的缺陷。考虑如下情况:
我们的APP已经发出了一个请求,在加载过程中网络状态发生了变化,例如你家wifi被隔壁老王搞坏之类的情况。这个时候我们的方法会提示网络变化,但是不会停止目前的请求,这个会给用户很不好的用户体验。作者现在已经有思路,有时间会将实现给大家。如果有好的意见欢迎大家提出。