2011-11-03 1 views
8

Estoy tratando de obtener una lista de cuentas de Twitter para cargar un UITableViewController que contiene los datos. Yo uso esta función:(iOS 5) al obtener una lista de cuentas de Twitter, TableView se cuelga?

- (void)viewDidLoad { 
    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { 
     ... 
     [[self tableView] insertRowsAtIndexPaths ...]; 
     [[self tableView] reloadData]; 
     NSLog("This message appears immediately"); 
     ... 
    }]; 
    NSLog("This message appears immediately"); 
} 

Por alguna razón, la interfaz parece "colgar" durante 5 segundos antes de la mesa en realidad se actualiza/vuelve a dibujar (en cuenta que yo estoy llamando reloadData!). Todos mis mensajes de registro se imprimen de inmediato, por lo que no estoy seguro de qué causa la congelación de la interfaz.

Respuesta

16

Todo,

Por lo tanto, he descubierto (más o menos). Supongo que tiene algo que ver con los hilos, se suponía que no debía hacer nada de interfaz de usuario en ese hilo.

Para solucionarlo, rodeé la materia mesa con un cierto código de despacho:

[account requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) 
{ dispatch_async(dispatch_get_main_queue(), ^{ 
    ... 
});}]; 

todavía tiene que entender lo que está pasando aquí, pero espero que esto le ayudará si alguien se encuentra con el mismo problema.

+0

El problema es que las llamadas de IU tienen que ocurrir en el hilo principal, y '-requestAccessToAccountsWithType: withCompletionHandler:' no garantiza que se llame a su bloque de finalización en el hilo principal. Su uso de 'dispatch_async' es correcto aquí, aunque si tiene más procesamiento que hacer antes de sus llamadas de interfaz de usuario, puede hacerlo libremente en la cola de segundo plano antes de la llamada' dispatch_async'. –

+0

Gracias amigo, tuve el mismo problema con el retraso de otra vista. Esto lo resolvió para mí. – thgc

+2

El código de ejemplo de Apple utiliza performSelectorOnMainThread: withObject: waitUntilDone: para hacer frente al hecho de que el método del controlador se realiza en una cola arbitraria. – sam

Cuestiones relacionadas