如何在ios上定义可达性超时

时间:2012-04-11 11:47:25

标签: objective-c ios reachability

我使用Reachability类来了解我是否有可用的互联网连接。问题是当wifi可用而不是互联网时,- (NetworkStatus) currentReachabilityStatus方法需要花费太多时间。

我的代码:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

应用程序暂时在第二行“冻结”。如何定义等待的最长时间?

2 个答案:

答案 0 :(得分:3)

我不这么认为。但更重要的是,如果可能,我认为你不想(你可能会得到误报)。让Reachability运行它。

如果你看一下Reachability演示项目,那么当你需要互联网时,这个概念就不会调用reachabilityWithHostName并检查currentReachabilityStatus。您在app delegate的didFinishLaunchingWithOptions期间调用currentReachabilityStatus,设置通知,并且当Internet连接发生更改时,Reachability将告诉。当我(a)在启动时设置可达性时,我发现对currentReachabilityStatus的后续检查速度非常快(无论连接性如何);但是(b)以及时的方式检查连接性。

如果你绝对需要立即开始处理,那么问题是你是否可以将其推到后台(例如dispatch_async())。例如,我的应用程序从服务器检索更新,但由于这种情况发生在后台,我和我的用户都不知道有任何延迟。

答案 1 :(得分:0)

我遇到了同样的问题,但我找到了一种指定超时的方法。我在Apple的Reachability Class中替换了这个方法。

- (NetworkStatus)currentReachabilityStatus
{
NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL     SCNetworkReachabilityRef");
//NetworkStatus returnValue = NotReachable;
__block SCNetworkReachabilityFlags flags;

__block BOOL timeOut = NO;
double delayInSeconds = 5.0;

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(delay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){

    timeOut = YES;

});

__block NetworkStatus returnValue = NotReachable;

__block BOOL returned = NO;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))
    {
        if (_alwaysReturnLocalWiFiStatus)
        {
            returnValue = [self localWiFiStatusForFlags:flags];
        }
        else
        {
            returnValue = [self networkStatusForFlags:flags];
        }
    }
    returned = YES;

});

while (!returned && !timeOut) {
    if (!timeOut && !returned){
        [NSThread sleepForTimeInterval:.02];
    } else {
        break;
    }
}

return returnValue;
}