Esta aplicación está modificando el motor de autolayout de un hilo de fondo, lo que puede provocar daños en el motor y lockings extraños

Recibo este registro en la consola cuando estoy ejecutando mi aplicación en simulador. No he visto esto en iOS 8. No estoy muy seguro de lo que está causando esto. ¿Alguien más ha tenido el mismo problema y, de ser así, cómo se solucionó? o hay alguna ayuda que alguien pueda brindar con respecto a esto?

No cambie la IU de nada que no sea el hilo principal. Si bien puede parecer que funciona en algunos sistemas operativos o dispositivos y no en otros, seguramente hará que la aplicación sea inestable y se bloquee de forma impredecible.

Si debe responder a una notificación, que puede suceder en segundo plano, asegúrese de que la invocación de UIKit se realice en el hilo principal .

Al menos tienes estas 2 opciones:

Despacho asincrónico

Use GCD (Grand Central Dispatch) si su observador puede ser notificado sobre cualquier hilo. Puedes escuchar y trabajar desde cualquier hilo y encapsular los cambios de UI en un dispatch_async :

 dispatch_async(dispatch_get_main_queue()) { // Do UI stuff here } 

Cuándo usar GCD ? Cuando no controlas quién envía la notificación. Puede ser el SO, un Cocoapod, bibliotecas integradas, etc. El uso de GCD se despertará en cualquier momento y en todo momento. Desventaja: se encuentra progtwigndo nuevamente el trabajo.


Escuchar en el hilo principal

Convenientemente, puede especificar en qué subproceso desea que se notifique al observador, en el momento de registrarse para las notificaciones, utilizando el parámetro de queue :

 addObserverForName:@"notification" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note){ // Do UI stuff here } 

¿Cuándo observar en el hilo principal ? Cuando ambos se registran y se registran. Desde el momento en que responde a la notificación, ya está donde debe estar.


Notificación de publicación en el hilo principal

 [self performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:NO]; 

Solución híbrida que no garantiza que el observador solo sea invocado desde dicho método. Permite un observador más ligero, a un costo menos robusto. Solo se menciona aquí como una solución que probablemente debas evitar .

Swift 3.0

 DispatchQueue.main.async { } 

Toda la actualización de la parte de la interfaz de usuario que necesita para pasar a la secuencia PRINCIPAL de la aplicación.

Estaba llamando a createMenuView () en segundo plano y obtuve el siguiente error

“Esta aplicación está modificando el motor de autolayout de un hilo de fondo, lo que puede provocar daños en el motor y caídas extrañas”

Así que llamé al método anterior al hilo principal Usando

  DispatchQueue.main.async { } 

en SWIFT 3.0 y Xcode 8.0

Corregir el código escrito a continuación:

 RequestAPI.post(postString: postString, url: "https://www.someurl.com") { (succeeded: Bool, msg: String, responceData:AnyObject) -> () in if(succeeded) { print(items: "User logged in. Registration is done.") // Move to the UI thread DispatchQueue.main.async (execute: { () -> Void in //Set User's logged in Util.set_IsUserLoggedIn(state: true) Util.set_UserData(userData: responceData) self.appDelegate.createMenuView() }) } else { // Move to the UI thread DispatchQueue.main.async (execute: { () -> Void in let alertcontroller = UIAlertController(title: JJS_MESSAGE, message: msg, preferredStyle: UIAlertControllerStyle.alert) alertcontroller.title = "No Internet" alertcontroller.message = FAILURE_MESSAGE self.present(alertcontroller, animated: true, completion: nil) }) } } 

Tiene un código que actualiza el diseño de la interfaz de usuario desde una cadena de fondo. No es necesario que se modifique la cola de operaciones en la que ejecuta el código. Por ejemplo, NSURLSession.shared () no usa la cola principal cuando realiza nuevas solicitudes. Para garantizar que su código se ejecute en el hilo principal, estoy usando el método estático de NSOperationQueue mainQueue ().

Rápido:

 NSOperationQueue.mainQueue().addOperationWithBlock(){ //Do UI stuff here } 

Obj-C:

 [NSOperationQueue mainQueue] addOperationWithBlock:^{ //Do UI stuff here }]; 

Debería probar Symbolic Breakpoint para detectar el problema: – enter image description here

Símbolo:

 [UIView layoutIfNeeded]` 

Condición:

 !(BOOL)[NSThread isMainThread] 

Luego ponga su código de actualización de UI en el hilo principal

 DispatchQueue.main.async {} 

El mismo problema ocurrió en mi caso, tengo que cambiar el código de la siguiente manera, entonces funciona bien. En ViewDidLoad , llama a este método usando el main thread ,

 [self performSelectorOnMainThread:@selector(setUpTableRows) withObject:nil waitUntilDone:YES];