在我的 iOS 项目中,我想在某些网络操作之前向用户显示一条连接到互联网的消息,因此我使用 Apple 的 Reachability 类编写了以下检查:
Reachability *reach = [Reachability reachabilityWithHostName:@"google.com"];
if([reach currentReachabilityStatus] == NotReachable) {
// ...prompt user to establish an internet connection
} else {
// ...send an asynchronous request with a timeout
}
然而,这有一个非常大的问题——当设备处于一个非常有损的网络上时(例如,当 OS X Lion 上的上行链路数据包丢失设置为 100% 时)网络链路调节器 http://9to5mac.com/2011/08/10/new-in-os-x-lion-network-link-conditioner-utility-lets-you-simulate-internet-and-bandwidth-conditions/), [Reachability reachabilityWithHostName:@"google.com"]
在确定连接不可用之前会阻塞主线程 30 秒。但是,以下代码不会阻塞:
if([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] == NotReachable) {
// ...prompt user to establish an internet connection
} else {
// ...send an asynchronous request with a timeout
}
查看 Reachability 的实现可以看出,这两种方法都使用了SystemConfiguration.framework
,但第一种方法使用SCNetworkReachabilityCreateWithName
而第二个使用SCNetworkReachabilityCreateWithAddress
。为什么第一个方法会阻塞,而第二个方法不会?第二种方法是检查连接性的好方法吗?或者,还有更好的方法?
检查这个函数:
- (BOOL)isNetworkAvailable
{
CFNetDiagnosticRef diag;
diag = CFNetDiagnosticCreateWithURL (NULL, (__bridge CFURLRef)[NSURL URLWithString:@"www.apple.com"]);
CFNetDiagnosticStatus status;
status = CFNetDiagnosticCopyNetworkStatusPassively (diag, NULL);
CFRelease (diag);
if ( status == kCFNetDiagnosticConnectionUp )
{
//NSLog (@"Connection is up");
return YES;
} else {
NSLog (@"Connection is down");
return NO;
}
}
这会工作得很好..
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)