Escribí una gran aplicación para iPad hace 2 años y ahora estoy volviendo a ella y actualizándola a iOS5. Es un poco complicado ya que fue mi primera gran aplicación para iPad.consejos para rastrear la IU de iOS de forma intermitente
Tiene un paso de "sincronización" que puede durar varios minutos y se trata de un conjunto de llamadas a métodos asíncronos que van y obtienen JSON de una url y los ingresan en los datos centrales. Con bastante frecuencia, la aplicación se congelará (la IU no responde).
¿Cuáles son algunas buenas técnicas para rastrear este congelamiento? El depurador no es tan útil ya que a menos que el código se esté ejecutando en el hilo principal, no tiene un rastro de pila utilizable. La aplicación a menudo tampoco recupera, lo que sugiere algún tipo de situación de bloqueo.
Aquí es un ejemplo particular que pueda ayudar:
me detuvo la ejecución una vez que comprobó que estaba congelado. Parece congelarse en la misma línea cada vez: una tarea simple. ¿Que esta pasando aqui? Es muy frustrante.
¿Este acceso a los datos centrales está causando esto? Cualquier puntero sería muy apreciado.
EDITAR 29-JUNIO-2012
Click here para ver la fuente de la clase que hace todo el Crear/actualizar/eliminación de objetos de datos básicos. Solo necesito detener el congelamiento/bloqueo en esta aplicación. Sé que es un desastre, me da vergüenza también. Lo escribí hace 2 años sin apenas conocimiento de objetivo-c. Debería volver a escribirlo, pero tengo que hacerlo funcionar y fuera de mi cabeza en 2 días. ¿Alguien podría darme consejos sobre los enfoques para obtener este thread-safe rápidamente? ¿Podría envolver cada método que actualiza NSManagedObjectContext en el código de bloque de despacho de grand central?
Cuando la UI deja de responder, se debe a que está ejecutando código en el hilo principal que debe ejecutarse en segundo plano. Puedes intentar pausar la aplicación durante este bloqueo y con suerte obtener un seguimiento de pila útil en el hilo principal ... pero probablemente no lo harás. La única forma que he encontrado realmente útil en este escenario es ser realmente crítico con el código que está ejecutando y dónde. Comprueba todas tus solicitudes web y el código relacionado de sincronización, y en cualquier otro lugar que creas que puede ser un proceso intenso. – Matt
Otra idea (en lugar de detenerse en el depurador y esperar lo mejor) podría ser ejecutar la aplicación en Instrumentos, que le dirá qué métodos están usando más tiempo. Lo encontré muy útil para depurar precisamente estos problemas. –
Actualicé una pregunta con un enlace a la fuente, si eso ayuda. –