iOS9 - 此应用程序正在从后台线程修改自动布局引擎 - 在哪里?

iOS9 - This application is modifying the autolayout engine from a background thread -- where?

对于搜索,错误信息是:

This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.

我知道这意味着一些 UIKit 代码是从后台线程调用的,我知道解决方案是将代码包装在

dispatch_async(dispatch_get_main_queue(), ^(void){ <code> });

我的问题是找到在哪里执行此操作,因为打印的堆栈跟踪中 none 引用了我的应用程序代码。我证明这个否定的证据是在调试输出 window 中搜索 (command-f) 我的应用程序的名称;我有 24 个堆栈跟踪被转储出来,我的应用程序名称不在任何一个中,除了在顶部有错误消息。我可以 post 其中之一,但这似乎不是很有用。

在我今天处理的案例中,在 viewWillDisappear() 之后和 viewWillAppear() 之前转换视图控制器时会发生这种情况。我发现我的部分代码可以环绕 dispatch_async(),但这些现在都已处理。我有断点和调试消息,其中分配和释放与视图控制器相关的对象,它们都在异常消息出现后触发。这在模拟器和我的 iOS9 iPhone 上都发生了,在调试和发布模式下都是如此。

如何识别明显修改 UI 的后台代码?

此代码 PSPDFUIKitMainThreadGuard 导致对 UI 主线程外的套件访问断言

使用步骤:

  1. 添加到项目并在没有 ARC 的情况下编译此文件
  2. PSPDFAssert 定义移动到文件的第一个
  3. 未定义 PSPDFLogError 的注释调用
  4. 进口<UIKit/UIKit.h>

您的应用程序将崩溃并停止任何尝试从后台线程UI修改任何元素

对于 swift 使用以下代码:NBUIKitMainThreadGuard

NSOperationQueue.mainQueue().addOperationWithBlock(){
[YOUR CODE]
}

编辑您的项目方案,并在 运行 操作下,在 诊断 选项卡中,在 运行time API Checking,确保选中 Pause in issues。当发生任何后台 UI 更新时,应用程序将暂停。