tab bar ios semaphore hang

tab - navigation bar ios



IOS semaphore_wait_trap en el hilo principal que provoca el bloqueo en la interfaz de usuario (2)

¿Es posible que IOS detenga el hilo principal (lo "atrapa") porque el trabajador está ejecutando durante mucho tiempo? - NO. Creo que su problema está relacionado con dibujar o cambiar algunos elementos de la interfaz de usuario. No se pueden llamar a todas las funciones desde el subproceso en segundo plano (por ejemplo, los cambios en los elementos de la IU deben realizarse en el subproceso principal). En su cola de serie, si algún método necesita cambiar elementos de UI, debe llamarlo en el hilo principal, por ejemplo

dispatch_async(dispatch_get_main_queue(), ^{ //do some main thread job here }); )

Tengo una función de larga ejecución dentro de una cola de trabajo asíncrona (serie). Sé que a veces esta función se cuelga dentro de una llamada openCV particular. Por alguna razón, este bloqueo también hace que el hilo principal se cuelgue. Al pausar e ingresar al modo de depuración, veo que hay una llamada a

semaphore_wait_trap()

en el hilo principal (cola)

Puedo suspender el hilo colgante (Mi cola de trabajo) en el modo de depuración y luego esta trampa desaparece y la GUI vuelve a responder en el teléfono.

Después de desactivar el hilo de trabajo, la GUI responde durante 1-2 segundos (sospecho que hasta que este hilo se active nuevamente) y luego la interfaz de usuario deja de responder una vez más.

Este hilo no realiza llamadas dispatch_sync() al hilo principal / Cola

¿Es posible que IOS detenga el hilo principal (lo "atrapa") porque el trabajador está ejecutando durante mucho tiempo?

¿Puedo forzarlo a quitar el bloque?

Estoy agregando algunas pantallas de impresión de la pila de modo de depuración.

Antes de suspender la cola colgante:

Y el hilo de colgar:

Y después de pausar y suspender la mala cola:


Tal vez, simplemente olvidó retener una variable en la llamada a la función de despacho (En cuanto a mí, se omitió una palabra clave estática antes de la declaración dispatch_once_t y el despacho no se puede procesar con la función en línea) El rastro de la pila era como el tuyo. Eso fue mi culpa

+ (instancetype)sharedInstance { (static was omitted) dispatch_once_t once; static id sharedInstance; dispatch_once(&once, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }