主线程阻塞导致应用程序在 iOS 8 中崩溃

main thread blockage is causing app to crash in iOS 8

我的应用程序在启动时崩溃,因为异常 'failed to scene-update in time'

这是因为可达性没有return准时 这是堆栈跟踪

com.tjango.Plus3未能及时更新场景

已用总 CPU 时间(秒):2.590(用户 2.590,系统 0.000),12% CPU
已用应用 CPU 时间(秒):0.302,1% CPU


线程 0 名称:调度队列:com.apple.main-thread
线程 0:
_semaphore_wait_trap + 8
__dispatch_semaphore_wait_slow + 252
_xpc_connection_send_message_with_reply_sync + 184
___SCNetworkReachabilityServer_targetStatus + 192
___SCNetworkReachabilityGetFlags + 440
_SCNetworkReachabilityGetFlags + 232
-[可达性currentReachabilityStatus] Reachability.m:295

这只发生在 iOS 8。

卡住的函数是Apple的Reachability库: 我不明白为什么这个函数会阻止它。

- (NetworkStatus)currentReachabilityStatus

{

    NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL SCNetworkReachabilityRef");

    网络状态 returnValue = NotReachable;

    SCNetworkReachabilityFlags 标志;



    如果 (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))

    {

        如果(_alwaysReturnLocalWiFiStatus)

        {

            return价值=[自我localWiFiStatusForFlags:flags];

        }

        别的

        {

            return值=[自我networkStatusForFlags:flags];

        }

    }



    return return值;

}

Reachability 可能是 iOS 上使用最不正确的库。这些规则有帮助:

  1. Reachability 不应在主线程上调用。在辅助线程上调用它并让该线程将网络更改通知主线程。
  2. 尝试连接前不要检查网络状态 - 只需尝试连接并根据需要处理错误。有时网络会离线以节省电量,直到有人尝试连接。
  3. 可达性主要用于检测网络在离线后何时恢复在线。您可以在此时重试失败的连接。

看我的评论:iOS Reachability fails to catch the case where connected to WiFi but not logged in