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

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

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

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


当前回答

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

其他回答

我在使用TouchID时遇到了这个问题,如果这对其他人有帮助,包装你的成功逻辑,它可能在主队列中对UI有作用。

斯威夫特4,

假设,如果您正在使用操作队列调用某个方法

operationQueue.addOperation({
            self.searchFavourites()
        })

假设函数searchfavorites是这样的,

func searchFavourites() {
     DispatchQueue.main.async {
                    //Your code
                }
}

如果你在主线程中调用“searchfavorites”方法中的所有代码,如果你在其中更新一些UI,它仍然会给出一个错误。

这个应用程序正在从后台修改自动布局引擎 从主线程访问引擎后的线程。

所以使用溶液,

operationQueue.addOperation({
            DispatchQueue.main.async {
                self.searchFavourites()
            }
        })

对于这种情况。

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

当我在一个NSURLConnection异步请求完成处理程序中调用一个做UI更新的块时,我有这个问题,因为更新到iOS 9 SDK。使用dispatch_main_queue将块调用放在dispatch_async中解决了这个问题。

它在iOS 8中运行良好。

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

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

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

断点1:

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

断点2:

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

断点3:

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

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