這個(gè)問(wèn)題困擾我有兩天,知道我對(duì)KVO有所了解矾瘾,知道今天我才解決這個(gè)難題。接下來(lái)我就介紹一下我是怎么解決的箭启『爵妫可能不是最好的,歡迎看到這片博客給出更好的意見(jiàn)傅寡。
在開(kāi)始之前我們首先要將Reachability導(dǎo)入到工程中放妈,注意,這個(gè)文件不是采用的ARC管理荐操,所以我們要做下手動(dòng)適配芜抒。其實(shí)也不是什么高科技。如圖
添加的內(nèi)容 -fno-objc-arc
,這里主要是為了讓其適配ARC工程托启。這里的話多說(shuō)一句宅倒,一般大家是用不到這個(gè),如果在MRC工程下兼容ARC模式的添加的代碼是 -fobjc-arc
屯耸。同樣這里也沒(méi)有什么特殊的意義拐迁,就是簡(jiǎn)單的是適配而已。
完成了上述事情之后肩民,我們就可以開(kāi)始我們的正事了唠亚。首先我們?cè)谶@里說(shuō)明一下我的思路链方。
1.為網(wǎng)絡(luò)狀態(tài)添加觀察者持痰。
2.實(shí)現(xiàn)觀察者觸發(fā)的動(dòng)作。
忽然發(fā)現(xiàn)好簡(jiǎn)單啊祟蚀,想當(dāng)初為啥沒(méi)搞出來(lái)的
首先我們給網(wǎng)絡(luò)狀態(tài)添加觀察者工窍,代碼如下:
- (void)monitorNetWorkStatus{
//創(chuàng)建對(duì)象 通過(guò)不斷的對(duì)百度的地址來(lái)檢測(cè)狀態(tài)
Reachability *reach = [Reachability reachabilityWithHostname:@"www.baidu.com"];
//2.注冊(cè)通知 監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
//3.觸發(fā)通知
[reach startNotifier];
}
這里我說(shuō)明一下為啥ping百度的主機(jī)割卖,其實(shí)吧,我就是覺(jué)得順手而已患雏,沒(méi)有其他意義鹏溯,如果讓我自己選,我更愿意pingwww.google.com
. 特別說(shuō)一下淹仑,本人沒(méi)有研究reachability的實(shí)現(xiàn)機(jī)制丙挽,至于更ping得原理是否一樣,我并不確定匀借,作者只是覺(jué)得兩者很想就這樣說(shuō)了颜阐。作者是一個(gè)很隨性的人,這點(diǎn)事情不要太糾結(jié)吓肋。染就說(shuō)來(lái)的童鞋凳怨,接的私信我。
完成了上述時(shí)間之后 我們接下里實(shí)現(xiàn)通知觸發(fā)的動(dòng)作代碼如下:
- (void)reachabilityChanged:(NSNotification *)center {
//獲得reachability
Reachability *reach = [center object];
if ([reach isReachable]) {
NSLog(@"網(wǎng)絡(luò)正常");
} else {
NSLog(@"網(wǎng)絡(luò)異常");
}
}
這是目前我實(shí)現(xiàn)的思路是鬼,如果有更好的童鞋肤舞,記得私信告訴啊,親測(cè)在XCode 7.2 iOS9.2下運(yùn)行沒(méi)問(wèn)題均蜜。
結(jié)束語(yǔ):
目前這個(gè)方法的實(shí)現(xiàn)循環(huán)監(jiān)聽(tīng)有個(gè)明顯的缺陷李剖。考慮如下情況:
我們的APP已經(jīng)發(fā)出了一個(gè)請(qǐng)求囤耳,在加載過(guò)程中網(wǎng)絡(luò)狀態(tài)發(fā)生了變化杖爽,例如你家wifi被隔壁老王搞壞之類(lèi)的情況。這個(gè)時(shí)候我們的方法會(huì)提示網(wǎng)絡(luò)變化紫皇,但是不會(huì)停止目前的請(qǐng)求慰安,這個(gè)會(huì)給用戶很不好的用戶體驗(yàn)。作者現(xiàn)在已經(jīng)有思路聪铺,有時(shí)間會(huì)將實(shí)現(xiàn)給大家化焕。如果有好的意見(jiàn)歡迎大家提出。