主线程在SCNetworkReachabilityGetFlags上被阻止

时间:2013-07-15 07:35:28

标签: iphone ios objective-c

直到现在,只发生一次。

我使用第三方库,并调用以下函数:

- (BOOL) isReachableViaWiFi {

    NSAssert(reachabilityRef, @"isReachableViaWiFi called with NULL reachabilityRef");

    SCNetworkReachabilityFlags flags = 0;
    NetworkStatus status = NotReachable;

    if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) {
        status = [self networkStatusForFlags: flags];
        return  (ReachableViaWiFi == status);
    }

    return NO;

} // isReachableViaWiFi

当我发现我的用户界面停止时,我暂停了程序执行,每次停在SCNetworkReachabilityGetFlags行:

enter image description here

enter image description here

我对此感到困惑。感谢您的任何提示。

2 个答案:

答案 0 :(得分:3)

根据您发布的代码,我会说您的问题是您在主线程中同步调用SCNetworkReachabilityGetFlags。我认为这个功能很可能会在互联网上发布一些东西。如果它尝试ping的远程主机由于某种原因无法访问(您丢失了互联网连接),您将获得普通的网络超时,这可能非常长(30秒)。您将在此时阻止主线程(包含所有UI)。

所以问题的解决方案可能是:在另一个队列/线程上调用此函数,然后将结果传递给主线程。通过这样做,您不会在等待远程主机响应时阻止主线程。

通常,您应该避免在主线程上运行任何网络交互代码。

答案 1 :(得分:1)

Reachability示例演示了SCNetworkReachability API的异步使用。您可以同步使用API​​,但不要在主线程上通过hostName发出同步检查。如果设备无法访问DNS服务器或网络速度较慢,则对SCNetworkReachabilityGetFlags函数的同步调用可能会阻止最多30秒尝试解析hostName。如果在主线程上发生这种情况,应用程序监视程序将在20秒不活动后终止应用程序。