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

主线程阻塞导致应用程序在iOS 8中崩溃,ios,iphone,ios8,reachability,Ios,Iphone,Ios8,Reachability,我的应用程序在启动时崩溃,原因是“未能及时更新场景” 这是因为可达性不会按时返回 这是堆栈跟踪 com.tjango.Plus3 failed to scene-update in time Elapsed total CPU time (seconds): 2.590 (user 2.590, system 0.000), 12% CPU Elapsed application CPU time (seconds): 0.302, 1% CPU Thread 0 name: Disp

我的应用程序在启动时崩溃,原因是“未能及时更新场景”

这是因为可达性不会按时返回 这是堆栈跟踪

com.tjango.Plus3 failed to scene-update in time Elapsed total CPU time (seconds): 2.590 (user 2.590, system 0.000), 12% CPU Elapsed application CPU time (seconds): 0.302, 1% CPU Thread 0 name: Dispatch queue: com.apple.main-thread 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 -[Reachability currentReachabilityStatus] Reachability.m:295 com.tjango.Plus3未能及时更新场景 已用CPU总时间(秒):2.590(用户2.590,系统0.000),12%CPU 已用应用程序CPU时间(秒):0.302,1%CPU 线程0名称:调度队列:com.apple.main-Thread 线程0: _信号灯等待陷阱+8 __调度信号灯等待慢+252 _xpc\u连接\u发送\u消息\u与\u回复\u同步+184 ___SCNetworkReachabilityServer_targetStatus+192 ___SCNetworkReachabilityGetFlags+440 _SCNetworkReachabilityGetFlags+232 -[可达性currentReachabilityStatus]可达性.m:295 这只发生在iOS 8上

它卡住的功能是苹果的可达性库: 我不明白为什么这个函数会阻止它

- (NetworkStatus)currentReachabilityStatus { NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL SCNetworkReachabilityRef"); NetworkStatus returnValue = NotReachable; SCNetworkReachabilityFlags flags; if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)) { if (_alwaysReturnLocalWiFiStatus) { returnValue = [self localWiFiStatusForFlags:flags]; } else { returnValue = [self networkStatusForFlags:flags]; } } return returnValue; } -(网络状态)当前可达性状态 { NSAssert(_reachabilityRef!=NULL,@“使用NULL SCNetworkReachabilityRef调用currentNetworkStatus”); NetworkStatus returnValue=不可访问; SCNetworkReachabilityFlags标志; if(SCNetworkReachabilityGetFlags(_reachabilityRef,&flags)) { 如果(_alwaysReturnLocalWiFiStatus) { returnValue=[self localWiFiStatusForFlags:flags]; } 其他的 { returnValue=[self-networkStatusForFlags:flags]; } } 返回值; }
可达性可能是iOS上使用最不正确的库。这些规则有助于:

  • 不应在主线程上调用可达性。在辅助线程上调用它,并让该线程将网络更改通知主线程
  • 在尝试连接之前不要检查网络状态-只需尝试连接并根据需要处理错误即可。有时,在有人尝试连接之前,网络将处于脱机状态以节省电源
  • 可达性主要用于检测网络离线后何时恢复在线。您可以在该点重试失败的连接

  • 请参阅我的评论:

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

  • 不应在主线程上调用可达性。在辅助线程上调用它,并让该线程将网络更改通知主线程
  • 在尝试连接之前不要检查网络状态-只需尝试连接并根据需要处理错误即可。有时,在有人尝试连接之前,网络将处于脱机状态以节省电源
  • 可达性主要用于检测网络离线后何时恢复在线。您可以在该点重试失败的连接

  • 请参阅我的评论:

    您看过吗?基本上,问题是:在主线程上运行的进程是否昂贵?在您的情况下,在启动应用程序时。如果您这样做,请分享它的代码。使其异步可能会解决您的问题。根据经验,您不应该在主线程上执行任何花费超过四分之一秒的操作。任何此类操作都必须在后台线程上执行(最好使用
    dispatch\u async()
    NSOperationQueue
    )?基本上,问题是:在主线程上运行的进程是否昂贵?在您的情况下,在启动应用程序时。如果您这样做,请分享它的代码。使其异步可能会解决您的问题。根据经验,您不应该在主线程上执行任何花费超过四分之一秒的操作。任何此类操作都必须在后台线程上完成(最好使用
    dispatch\u async()
    NSOperationQueue
    )。