human guidelines bar ios multithreading user-interface blocking

guidelines - iOS Cómo determinar qué está bloqueando la interfaz de usuario



ios toolbar (4)

Soy bastante nuevo en el desarrollo de iOS, pero estoy empezando a comprender algunos de los conceptos más complicados. Actualmente tengo una aplicación que implementa un AVCam para capturar video. La AVCam se crea en un subproceso independiente, pero usa una vista que está en mi archivo xib principal. Cuando la cámara termina de capturar, llama a una función completa en mi clase ViewController. Dentro de la función completa, llamo a otras funciones que actualizan la interfaz de usuario, así como a algunos NSLogs. Todo parece funcionar bien, veo los registros en la consola inmediatamente, pero la interfaz de usuario tarda otros 3 segundos en actualizarse. He intentado usar instrumentos para encontrar el código ofensivo, pero parece que no puedo encontrarlo. ¿Hay otra manera de determinar qué está bloqueando por UI?

Aquí está el código llamado cuando se completa la grabación;

-(void)movieRecordingCompleted{ [HUD hide:YES]; NSLog(@"movieRecordingCompleted"); [self showModalViewController]; NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mov"]; NSLog(@"pathToMovie: %@", pathToMovie); pathToTreatedVid = pathToMovie; NSLog(@"File Save Called"); UISaveVideoAtPathToSavedPhotosAlbum(pathToMovie, nil, NULL, NULL); }

Todo se registra de inmediato, pero el HUD de progreso y el controlador de vista modal no se activan durante aproximadamente 2 a 5 segundos, es muy extraño.

Aquí está el estado anterior y posterior de los hilos (cuando se congela y cuando se descongela).


Intente pausar la ejecución del programa (hay un botón para eso en el panel inferior de Xcode , el tercero)

  • Luego mira el panel izquierdo ( Navigator panel ),
  • Encuentra Debug Navigator
  • Encuentre el hilo con la función main , y mb puede averiguar por métodos en este hilo, lo que lleva tanto tiempo para actualizar su interfaz de usuario. El método que está funcionando en este momento es el negro superior generalmente (con los métodos internos de obj-c listados en color gris).

Me gusta usar esta función:

sleep(x);

donde "x" es el número de segundos ... simplemente bloqueará cualquier hilo que se ejecute durante ese número de segundos. Si su UI se congela, sabe que bloqueó el subproceso principal y, por lo tanto, ese código se está ejecutando en el subproceso principal (ya sea que lo haya querido o no). Intente colocar esta llamada en diferentes lugares de su código y debería ayudarlo a diagnosticar lo que está sucediendo. Espero que ayude.


Puede usar la herramienta Rastreo del sistema en Instrumentos ejecutando su aplicación en modo perfil. Luego obtendrá un resumen detallado de todos los subprocesos en el sistema junto con los seguimientos de la pila en cada evento de programación por el que pasa el subproceso.

Hay un gran video del Seguimiento del sistema de la WWDC 2016 en profundidad que lo guiará a través de la depuración de un problema de subprocesos bloqueados.

Esto es mucho mejor que el instrumento Time Profiler ya que esa herramienta funciona basándose en tomar muestras de lo que se está ejecutando en la CPU a intervalos. Sin embargo, si su hilo está bloqueado, no se está ejecutando en la CPU, por lo que no se muestreará. Es posible que tengas tu hilo principal bloqueado por un segundo entero, pero no aparecerá en Time Profiler.


Puedes usar Time Profiler para descubrir qué está bloqueando tu aplicación.