我的可达性与本线程中的建议完全一样。
我使用的是开源可达性。然而,我使用的不是块,而是通知,因此这个过程与苹果的可达性代码非常相似。
我第一次启动这个应用程序时,我运行了这个程序,它运行得很好。
Reachability *reachability = [reach hostReachability];
[reachability startNotifier];
可达性更改:事件正在激发:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachability_Changed:) name:kReachabilityChangedNotification object:nil];
然而,一旦我按下主页按钮并返回应用程序,startNotifier
就会在内部返回NO而不是YES。
// Set it as our reachability queue, which will retain the queue
if(!SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue))
{
#ifdef DEBUG
NSLog(@"SCNetworkReachabilitySetDispatchQueue() failed: %s", SCErrorString(SCError()));
#endif
...
return NO;
因此上述事件再也不会被触发。
除非我错误地使用了这个,并且当可达性被实例化时,startNotifier
应该只在init
中调用一次,然后再也不调用了?
self.hostReachability = [Reachability reachabilityWithHostname:_HOST];
您应该只需要在init/load上调用[self.hostReachability startNotifier]
一次。以下是您的基本需求概述,使用通知而不是链接线程上的块方法:
-
将tonymillion/可达性库添加到您的项目中。
-
为您的可达性对象创建属性以确保它被保留,例如
@interface ViewController () { NSString *_HOST; } @property Reachability *hostReachability; @end
-
注册更改通知,并启动通知程序,例如
- (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; _HOST = @"www.google.com"; self.hostReachability = [Reachability reachabilityWithHostname:_HOST]; [self.hostReachability startNotifier]; } - (void)viewDidUnload { [super viewDidUnload]; [[NSNotificationCenter defaultCenter] removeObserver:self]; }
-
最后,创建一个
reachabilityChanged:
方法来处理您对可达性更改的响应,例如- (void)reachabilityChanged:(NSNotification*)notification { Reachability *notifier = [notification object]; NSLog(@"%@", [notifier currentReachabilityString]); }
注意:如果您按下主页按钮并卸载应用程序,可访问性的更改应在返回应用程序后立即发出通知。