1

到现在,只发生过一次。

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

- (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

当我发现我的 UI 停止时,我暂停了程序执行,并且每次它都停在SCNetworkReachabilityGetFlags一行:

在此处输入图像描述

在此处输入图像描述

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

4

2 回答 2

3

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

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

一般来说,您应该避免在主线程上运行任何网络交互代码。

于 2013-07-15T08:02:07.367 回答
1

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

于 2014-11-27T07:44:46.383 回答