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.
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'. –
Gracias amigo, tuve el mismo problema con el retraso de otra vista. Esto lo resolvió para mí. – thgc
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