Search code examples
iosswiftfirebasefirebase-authenticationdispatch-async

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


I am stuck figuring out how to fix an "This application is modifying the autolayout engine from a background thread" error. Any help is greatly appreciated.

I tried the approach outlined from this similar question to use dispatch_async(dispatch_get_main_qeueu()) but it is not solving the problem. Am I using it incorrectly?

From debugging I have isolated that a Firebase call to reset the user password is at least part of the issue. When I leave out that code there is no error.

Relevant code and full error message is below:

    //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)
            }
        })
        })
    }
}

Full error thrown:

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
)

Thank you for any ideas or thoughts!


Solution

  • Try this:

    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)
        }
      })
    })