单独线程上的通知的可达性问题

时间:2010-07-29 13:40:49

标签: iphone nsthread reachability

我使用了Apples Reachability类,如果我将它保留在主线程上(错误的方法),它就可以工作。如果我将其移动到单独的线程,则永远不会调用通知。

didFinishLaunchingWithOptions我呼叫以下内容:

[NSThread detachNewThreadSelector:@selector(checkConnection) toTarget:self withObject: nil];

checkConnection如下所示:

-(void)checkConnection {
//Test for Internet Connection
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
Reachability *r = [[Reachability reachabilityWithHostName:@"appspot.com"] retain];
[r updateReachability:appDelegate.reachability];
[r startNotifier];
[pool release]; 
}

和reachabilityChanged看起来像这样:

- (void)reachabilityChanged:(NSNotification *)note {
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
[self updateReachability: curReach];
}

最后updateReachability看起来像这样:

- (void)updateReachability:(Reachability *)curReach {
NetworkStatus internetStatus = [curReach currentReachabilityStatus];
if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)) {
    NSLog(@"No net");
} else {
    NSLog(@"Lots of net");
}}

希望你们能帮助我理解为什么reachabilityChanged永远不会被召唤。

干杯...

2 个答案:

答案 0 :(得分:1)

我已经在Mac上使用了Apple的可访问性示例,并且已经将其运行良好。您可以在主线程上运行可访问性。可达性的重点在于您不必为Internet连接提供池。系统自动生成后台线程以监视互联网连接的变化,并将通知您任何更改。

您的应用程序是否因为可达性而停滞不前,或者您只是假设它可能会发生?

答案 1 :(得分:0)