直到现在,只发生一次。
我使用第三方库,并调用以下函数:
- (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
行:
我对此感到困惑。感谢您的任何提示。
答案 0 :(得分:3)
根据您发布的代码,我会说您的问题是您在主线程中同步调用SCNetworkReachabilityGetFlags。我认为这个功能很可能会在互联网上发布一些东西。如果它尝试ping的远程主机由于某种原因无法访问(您丢失了互联网连接),您将获得普通的网络超时,这可能非常长(30秒)。您将在此时阻止主线程(包含所有UI)。
所以问题的解决方案可能是:在另一个队列/线程上调用此函数,然后将结果传递给主线程。通过这样做,您不会在等待远程主机响应时阻止主线程。
通常,您应该避免在主线程上运行任何网络交互代码。
答案 1 :(得分:1)
Reachability示例演示了SCNetworkReachability API的异步使用。您可以同步使用API,但不要在主线程上通过hostName发出同步检查。如果设备无法访问DNS服务器或网络速度较慢,则对SCNetworkReachabilityGetFlags函数的同步调用可能会阻止最多30秒尝试解析hostName。如果在主线程上发生这种情况,应用程序监视程序将在20秒不活动后终止应用程序。