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

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

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

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


当前回答

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

其他回答

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

当您尝试更新文本字段值或在后台线程中添加子视图时,可能会遇到此问题。因此,应该将这类代码放在主线程中。

您需要用dispatch_asynch包装调用UI更新的方法以获得主队列。例如:

dispatch_async(dispatch_get_main_queue(), { () -> Void in
   self.friendLabel.text = "You are following \(friendCount) accounts"
})

编辑- swift 3:

现在,我们可以按照下面的代码来做:

// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
   // Do long running task here
   // Bounce back to the main thread to update the UI
   DispatchQueue.main.async {
      self.friendLabel.text = "You are following \(friendCount) accounts"
   }
}

斯威夫特4,

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

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

假设函数searchfavorites是这样的,

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

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

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

所以使用溶液,

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

对于这种情况。

在不使用'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