Recientemente tuve un problema similar yo mismo. Lo más probable es que sus actualizaciones retrasadas sean cosas que esté haciendo en la interfaz de usuario. Y aquí está el problema: no se está ejecutando en el hilo principal de la aplicación (también llamado el hilo de UI). Por lo tanto, lo que cambie a la interfaz de usuario no será visible hasta que ... parezca que aparece, lo que suele ocurrir con un redibujado provocado por otra cosa en la aplicación.
Lo que tienes que hacer es dentro de su cola de bloque de sus actualizaciones gráficas en el hilo de interfaz de usuario como esto:
dispatch_async(dispatch_get_main_queue(), ^{
// Do GUI stuff.
});
veces su bloque podría ser grande o simplemente utilizando el código que anteriormente se ejecuta en el hilo principal, por lo que es difícil moverlo todo a un lugar específico para ejecutarlo en la cola principal. Para estas situaciones, la cola de una actualización forzada en el hilo de interfaz de usuario al final de su bloque:
dispatch_async(dispatch_get_main_queue(), ^{
[self.somewidget setNeedsDisplay];
[self.view setNeedsDisplay];
[self.dontforgetme setNeedsDisplay];
});
Con respecto a su "aplicación que toman el tiempo de respuesta dulce de mi aplicación", parece que son tratando de usar GDC para evitar bloquear la interfaz de usuario. Para asegurarse mediante programación que no sucede a hacer operaciones intensivas de la CPU en el hilo de interfaz de usuario, y viceversa, se corre actualizaciones interfaz gráfica de usuario en el bloque de interfaz de usuario, me he hecho las siguientes macros:
/// Stick this in code you want to assert if run on the main UI thread.
#define DONT_BLOCK_UI() \
NSAssert(![NSThread isMainThread], @"Don't block the UI thread please!")
/// Stick this in code you want to assert if run on a background thread.
#define BLOCK_UI() \
NSAssert([NSThread isMainThread], @"You aren't running in the UI thread!")
Como puede ver por los comentarios, tiendo a usar estas macros al comienzo de los métodos que deseo asegurar que no estoy usando por error en el lugar equivocado. He puesto estas macros y más cosas al azar en https://github.com/gradha/ELHASO-iOS-snippets que pueden serle útiles.
¿Por qué esperaría que su registro se muestre inmediatamente? Su "montón de código" puede tardar unos segundos en ejecutarse, retrasando mucho el registro, ya que solo se ejecutará después de que el resto del código de su bloque lo tenga. –
Esto es lo que me confunde. Es después de cada bit de código y, sin embargo, aparece inmediatamente, mientras que el código tarda unos segundos en mostrar los resultados en la pantalla. – Andrew
OK, ¿entonces está diciendo que la declaración NSLog tiene su texto que aparece inmediatamente en la consola, pero su "montón de código" contiene otras actualizaciones de IU que no tienen efecto en la pantalla de inmediato?Si ese es el caso, ¿qué tipo de actualizaciones de UI son? ¿Se envían de forma asíncrona en el hilo principal? ¿Hay algún proceso que pueda quedar atrapado en un lazo cerrado en el hilo principal después de enviar este bloque, lo que podría prevenir las actualizaciones de UI? –