2011-04-16 18 views
18

Estoy usando MBProgressHUD para mostrar una animación "ocupada" para usar al usuario mientras se está llenando un UITableView. El UITableView bloquea el hilo principal por lo que la animación ni siquiera aparece hasta que la tabla termina de cargarse.Ejecuta MBProgressHUD en otro hilo?

¿Hay alguna manera de hacer que la animación ocupada se ejecute en otro hilo mientras el UITableView ocupa el hilo principal?

Respuesta

40

UIKit hace su dibujo cuando el ciclo de ejecución completa el ciclo actual. En otras palabras, si está configurando una vista (por ejemplo, MBProgressHUD), los cambios no serán visibles hasta la próxima iteración del ciclo de ejecución. Por lo tanto, si no permite que el ciclo de ejecución gire al bloquear el hilo principal, los cambios de la interfaz de usuario no aparecerán de inmediato.

Si no puede hacer su trabajo en un subproceso en segundo plano, debe permitir que el ciclo de ejecución complete su ciclo antes de comenzar su tarea de bloqueo de larga ejecución en el subproceso principal.

Puede hacer esto programando la ejecución en la siguiente iteración del ciclo de ejecución.

// Setup and show HUD here 

[self performSelector:@selector(myTask) withObject:nil afterDelay:0.001]; 

Oculte el HUD al final de myTask. O puede ejecutar el ciclo de ejecución manualmente.

// Setup and show HUD here 

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantPast]]; 

// Insert myTask code here 
// Hide the shown HUD here 

O (si se puede utilizar bloques)

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void){ 
    // Insert myTask code here 
}); 
+0

Me gustaría poder upvote esto más. –

+0

gracias, funciona como encanto :) –

+0

El código anterior está causando pérdida de memoria. ¿Alguna de idea de cómo arreglarlo? – arundevma

Cuestiones relacionadas