/ / ¿Cómo hacer que MainThread espere hasta que se realice alguna acción asíncrona? - objectivo-c, ios, multiproceso, uitableview, asíncrono

¿Cómo hacer que MainThread espere hasta que se realice una acción asíncrona? - objetivo-c, ios, multihilo, uitableview, asincrónico

yo tengo UITableView con algún contenido, que se carga en asincrónico camino. Cuando el usuario gira el dispositivo necesito hacer [tableView reloadData] en -willRotateToInterfaceOrientation método. ReloadData funciona de forma asíncrona en mi caso.

Entiendo que reloadData funciona en el subproceso principal, pero activa cellForRowAtIndexPath, que funciona asíncrono en mi caso.

Así que la pregunta es cómo hacer que el hilo principal espere hasta UITableView"s reloadData termina

Respuestas

2 para la respuesta № 1

Si llamas a reloadData desdewillRotateToInterfaceOrientation luego se llama en el hilo principal. De hecho, las UIViews NO son seguras para subprocesos y solo deben tratarse desde el subproceso principal (en caso de que por alguna razón alguien tenga la idea de llamar a reloadData desde otro subproceso).

Creo que hay confusión en relación con"asíncrono" como un término. Las devoluciones de llamada asíncronas para los delegados de IU como willRotateToInterfaceOrientation se llaman en el hilo principal. Ser asíncrono no significa necesariamente que un subproceso diferente (aunque la ejecución asincrónica "en paralelo" sí lo hace).

Recomendaría leer la documentación de Apple para NSRunLoop. Es una parte integral de la forma en que se ejecutan las aplicaciones de iOS y es una necesidad para que los programadores de aplicaciones entiendan.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html


3 para la respuesta № 2

Puedes utilizar CFRunLoopRun para hacer que su hilo principal espere hasta que se recarguen los datos de UITableView. Después de que se recarguen los datos de la llamada CFRunLoopStop pasando el resultado de CFRunLoopGetMain como parametro


2 para la respuesta № 3

Deberá cargar los datos de su tabla en segundo plano, luego llamar al método reloadData de UITableView.

Puede usar GCD para enviar fácilmente su función de carga de forma asíncrona a una cola de fondo. Cuando esa tarea haya finalizado, haga que el subproceso de trabajo vuelva al subproceso principal, un bloque que llama [tableView reloadData]. Así es cómo:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

...
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{

// load your table data here
[self loadMyTableData];

// when done dispatch back to the main queue to load the table
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{

[self.tableView reloadData];
});
});
...
}