在我的OS X中使用swift遇到了很多这个错误:
“这个应用程序正在从后台线程修改自动布局引擎,这可能会导致引擎损坏和奇怪的崩溃。这将在未来的版本中导致异常。”
我有一个NSWindow我将视图交换到窗口的contentView。当我尝试执行NSApp时会得到错误。或者当我向窗口添加子视图时。尝试禁用自动调整大小的东西,我没有任何使用自动布局的东西。任何想法吗?
有时它很好,什么都没有发生,其他时候它完全破坏了我的UI,什么都没有加载
在我的OS X中使用swift遇到了很多这个错误:
“这个应用程序正在从后台线程修改自动布局引擎,这可能会导致引擎损坏和奇怪的崩溃。这将在未来的版本中导致异常。”
我有一个NSWindow我将视图交换到窗口的contentView。当我尝试执行NSApp时会得到错误。或者当我向窗口添加子视图时。尝试禁用自动调整大小的东西,我没有任何使用自动布局的东西。任何想法吗?
有时它很好,什么都没有发生,其他时候它完全破坏了我的UI,什么都没有加载
当前回答
如果要查找此错误,请使用主线程检查器暂停问题复选框。 在大多数情况下,修复它很容易,只需将有问题的行分派到主队列中即可。
其他回答
你不能在主线程中越位修改UI !UIKit不是线程安全的,所以如果你这样做,上面的问题和其他一些奇怪的问题会出现。应用程序甚至会崩溃。
所以,要做UIKit操作,你需要定义block并让它在主队列上执行:例如,
NSOperationQueue.mainQueue().addOperationWithBlock {
}
我在使用TouchID时遇到了这个问题,如果这对其他人有帮助,包装你的成功逻辑,它可能在主队列中对UI有作用。
它需要放在一个不同的线程中,允许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
});
在不使用'dispatch_async'的情况下调试print语句时会得到类似的错误消息 因此,当您得到错误消息时,就可以使用了
斯威夫特4
DispatchQueue.main.async { //code }
斯威夫特3
DispatchQueue.main.async(){ //code }
早期的Swift版本
dispatch_async(dispatch_get_main_queue()){ //code }
“此应用程序正在从后台线程修改自动布局引擎”错误在实际问题发生后很长时间才会记录在控制台中,因此如果不使用断点,调试这个错误可能会很困难。
我使用@markussvensson的答案来检测我的问题,并使用这个符号断点(调试>断点>创建符号断点)发现它:
符号:[UIView layoutIfNeeded]或[UIView updateConstraintsIfNeeded] 条件:!(BOOL)[NSThread是主线程]
在模拟器上构建和运行应用程序,并复制导致抛出错误消息的步骤(应用程序将比平时慢!)然后Xcode将停止应用程序并标记从后台线程访问UI的代码行(例如func的调用)。