sirve - iphone bloqueado por icloud solucion
Esta aplicación está modificando el motor de reproducción automática desde un subproceso en segundo plano, lo que puede provocar daños en el motor y bloqueos extraños. (6)
Debería probar Symbolic Breakpoint para detectar el problema: -
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 {}
Recibo este registro en la consola cuando ejecuto mi aplicación en simulador. No he visto esto en iOS 8. No estoy muy seguro de qué está causando esto. ¿Alguien más se ha encontrado con el mismo problema y, de ser así, cómo se solucionó? ¿O hay alguna ayuda que alguien pueda proporcionar con respecto a esto?
El mismo problema ocurre en mi caso, tengo que cambiar el código de la siguiente manera y luego funciona bien.
En
ViewDidLoad
, llame a este método utilizando el
main thread
,
[self performSelectorOnMainThread:@selector(setUpTableRows) withObject:nil waitUntilDone:YES];
No cambie la IU de otra cosa que no sea el hilo principal. Si bien puede parecer que funciona en algunos sistemas operativos o dispositivos y no en otros, es probable que haga que su 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 en cualquier hilo.
Puede escuchar y trabajar desde cualquier subproceso, y encapsular los cambios de la interfaz de usuario 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 sistema operativo, un Cocoapod, bibliotecas integradas, etc. El uso de
GCD
activará en cualquier momento, siempre.
Desventaja: te encuentras reprogramando el trabajo.
Escuchar en hilo principal
Convenientemente, puede especificar en qué hilo desea que se notifique al observador,
en el momento en que se registra
para recibir 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 se está registrando y registrado. Pero cuando responda a la notificación, ya estará donde debe estar.
Notificación posterior 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 de diseño menos robusto. Solo se menciona aquí como una solución que probablemente debería evitar .
Swift 3.0
DispatchQueue.main.async {
}
Tiene un código que actualiza el diseño de la interfaz de usuario desde un hilo de fondo. Cambiar la cola de operación en la que ejecuta su código no necesita ser explícito. Por ejemplo, NSURLSession.shared () no usa la cola principal cuando realiza nuevas solicitudes. Para asegurar 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
}];
Toda la actualización de la parte de la interfaz de usuario que necesita para pasar al hilo 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 reproducción automática desde un subproceso en segundo plano, lo que puede provocar daños en el motor y bloqueos extraños"
Entonces llamé al método anterior en el hilo principal usando
DispatchQueue.main.async {
}
en SWIFT 3.0 y Xcode 8.0
Código correcto 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)
})
}
}