"This application is modifying the autolayout engine" 错误 (Swift iOS)

"This application is modifying the autolayout engine" error (Swift iOS)

我一直在思考如何修复 "This application is modifying the autolayout engine from a background thread" 错误。非常感谢任何帮助。

我尝试了 概述的方法来使用 dispatch_async(dispatch_get_main_qeueu()) 但它没有解决问题。我是不是用错了?

从调试中我发现,重置用户密码的 Firebase 调用至少是问题的一部分。当我省略该代码时,没有错误。

相关代码和完整错误信息如下:

    //MARK: - Forgot Password Button Tapped
    @IBAction func forgotPasswordButtonTapped(sender: AnyObject) {

    let userEnteredEmail = emailTextField.text

    //Have Firebase send email to reset password      
        dispatch_async(dispatch_get_main_queue(), {

        FIRAuth.auth()?.sendPasswordResetWithEmail(userEnteredEmail!, completion: { error in

            if error != nil {

                //Tell user that the user name or password is incorrect.
                let errorCode = error!.code

                switch (errorCode) {
                    // Error code handling alerting user to issue.
                    }
            }
            else {
                //Send user to the forgot password screen.
                self.performSegueWithIdentifier("toForgotPasswordViewController", sender: self)
            }
        })
        })
    }
}

抛出完整错误:

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.
Stack:(

0   CoreFoundation                      0x000000010a87dd85 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x000000010c6a5deb objc_exception_throw + 48
2   CoreFoundation                      0x000000010a87dcbd +[NSException raise:format:] + 205
3   Foundation                          0x000000010adf8b6b _AssertAutolayoutOnMainThreadOnly + 79
4   Foundation                          0x000000010adf8a62 -[NSISEngine _optimizeWithoutRebuilding] + 49
5   Foundation                          0x000000010ac57c0f -[NSISEngine optimize] + 46
6   Foundation                          0x000000010ac5842d -[NSISEngine withBehaviors:performModifications:] + 245
7   UIKit                               0x000000010b9e6adb -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 58
8   UIKit                               0x000000010b9e761e -[UIView(AdditionalLayoutSupport) updateConstraintsIfNeeded] + 254
9   UIKit                               0x000000010b9e8333 -[UIView(AdditionalLayoutSupport) _updateConstraintsAtEngineLevelIfNeeded] + 272
10  UIKit                               0x000000010b19ca96 -[UIView(Hierarchy) _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 159
11  UIKit                               0x000000010b1ac980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
12  QuartzCore                          0x0000000109e05c00 -[CALayer layoutSublayers] + 146
13  QuartzCore                          0x0000000109dfa08e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
14  QuartzCore                          0x0000000109df9f0c _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
15  QuartzCore                          0x0000000109dee3c9 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
16  QuartzCore                          0x0000000109e1c086 _ZN2CA11Transaction6commitEv + 486
17  QuartzCore                          0x0000000109e1c378 _ZN2CA11Transaction14release_threadEPv + 224
18  libsystem_pthread.dylib             0x000000010d4d7387 _pthread_tsd_cleanup + 470
19  libsystem_pthread.dylib             0x000000010d4d6f63 _pthread_exit + 117
20  libsystem_pthread.dylib             0x000000010d4d5582 pthread_attr_getschedpolicy + 0
21  libsystem_pthread.dylib             0x000000010d4d3341 start_wqthread + 13
)

感谢您的任何想法或想法!

试试这个:

FIRAuth.auth()?.sendPasswordResetWithEmail(userEnteredEmail!, completion: { error in
  dispatch_async(dispatch_get_main_queue(), {
    if error != nil {

      //Tell user that the user name or password is incorrect.
      let errorCode = error!.code

      switch (errorCode) {
        // Error code handling alerting user to issue.
      }
    }
    else {
      //Send user to the forgot password screen.
      self.performSegueWithIdentifier("toForgotPasswordViewController", sender: self)
    }
  })
})

应该尝试使用符号断点来检测问题:-

然后把你的UI更新代码放到主线程

DispatchQueue.main.async {}