3

Je suis coincé comprendre comment réparer une erreur "Cette application est en train de modifier le moteur autolayout d'un thread d'arrière-plan". Toute aide est grandement appréciée."Cette application est en train de modifier le moteur de mise en page automatique" erreur (iOS Swift)

J'ai essayé l'approche décrite de this similar question pour utiliser dispatch_async (dispatch_get_main_qeueu()) mais cela ne résout pas le problème. Est-ce que je l'utilise incorrectement? A partir du débogage, j'ai isolé qu'un appel Firebase pour réinitialiser le mot de passe de l'utilisateur est au moins une partie du problème. Quand je laisse ce code, il n'y a pas d'erreur.

code approprié et message d'erreur complet est ci-dessous:

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

erreur complète jeté:

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 
) 

Merci pour toutes les idées ou pensées!

+2

Avez-vous vérifié, que ce soit FIRAuth le rappel est dans le thread principal? – mbutan

+0

Ce n'est certainement pas le cas. Faites un autre dispatch_async au thread principal dans le rappel FIRAuth. – par

+0

Pourriez-vous s'il vous plaît être plus précis sur ce que vous entendez par si le rappel FIRAuth est dans le fil principal? Je sais assez pour être dangereux avec Firebase et iOS, mais je ne suis pas un expert. Je ne sais pas où cet autre dispatch_async devrait aller vous mentionné. Merci. – Ben

Répondre

6

Essayez ceci:

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

Oui! C'était ce qui me manquait. Je vous remercie!!! – Ben

0

devrait essayer Breakpoint symbolique pour détecter la question: - enter image description here

Ensuite, mettez votre interface utilisateur du code de mise à jour dans le thread principal

DispatchQueue.main.async {}