在我的OS X中使用swift遇到了很多这个错误:

“这个应用程序正在从后台线程修改自动布局引擎,这可能会导致引擎损坏和奇怪的崩溃。这将在未来的版本中导致异常。”

我有一个NSWindow我将视图交换到窗口的contentView。当我尝试执行NSApp时会得到错误。或者当我向窗口添加子视图时。尝试禁用自动调整大小的东西,我没有任何使用自动布局的东西。任何想法吗?

有时它很好,什么都没有发生,其他时候它完全破坏了我的UI,什么都没有加载


当前回答

在不使用'dispatch_async'的情况下调试print语句时会得到类似的错误消息 因此,当您得到错误消息时,就可以使用了

斯威夫特4

DispatchQueue.main.async { //code }

斯威夫特3

DispatchQueue.main.async(){ //code }

早期的Swift版本

dispatch_async(dispatch_get_main_queue()){ //code }

其他回答

它可以像设置文本字段/标签值或在后台线程中添加子视图一样简单,这可能会导致字段的布局发生变化。确保你对接口所做的任何事情都只发生在主线程中。

查看这个链接:https://forums.developer.apple.com/thread/7399

对我来说,问题是这样的。 确保在主线程上执行performSegueWithIdentifier::

dispatch_async (dispatch_get_main_queue(), ^{
  [self performSegueWithIdentifier:@"ViewController" sender:nil];
});

它需要放在一个不同的线程中,允许UI在线程函数执行完成后立即更新:

现代迅速:

DispatchQueue.main.async {
    // Update UI
}

旧版本的Swift,在Swift 3之前。

dispatch_async(dispatch_get_main_queue(){
    // code here
})

objective - c:

dispatch_async(dispatch_get_main_queue(), ^{
    // code here
});

有同样的问题,因为我正在使用performSelectorInBackground。

“这个应用程序正在从后台线程修改自动布局引擎”的主要问题是,它似乎在实际问题发生后很长一段时间才被记录下来,这可能会使它很难排除故障。

我设法通过创建三个符号断点来解决这个问题。

调试>断点>创建符号断点…

断点1:

符号:-[UIView setNeedsLayout] 条件:!(BOOL)[NSThread是主线程]

断点2:

符号:-[UIView layoutIfNeeded] 条件:!(BOOL)[NSThread是主线程]

断点3:

符号:-[UIView updateConstraintsIfNeeded] 条件:!(BOOL)[NSThread是主线程]

使用这些断点,您可以很容易地在非主线程上错误地调用UI方法的实际行中获得断点。