Después de copiar algo ingenuamente en la solución de yonel y llamarla bien, me di cuenta de que llamar al performSelectorOnMainThread:withObject:waitUntilDone:
solucionó el síntoma, pero no el problema. El problema más grande es que está realizando actualizaciones de UI mientras aún está en el contexto del subproceso asincrónico o de fondo.
Esto es lo que mi código parecía:
dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL);
dispatch_async(queue, ^{
// Make API call
// Retrieve data, parse JSON, update local properties
// Make a call to reload table data
});
cuando debería tener este aspecto:
dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL);
dispatch_async(queue, ^{
// Make API call
// Retrieve data, parse JSON, update local properties
dispatch_async(dispatch_get_main_queue(), ^{
// Now make the call to reload data and make any other UI updates
[self.tableView reloadData]
});
});
Si lo única lo que necesita hacer es llamar [self.tableView reloadData]
es probablemente muy bien a use performSelectorOnMainThread:withObject:waitUntilDone:
ya que logra el mismo objetivo, pero también debe reconocer lo que está sucediendo en el panorama general. Además, si está haciendo más trabajo de UI que simplemente volver a cargar la tabla, todo ese código debería ir también a la cola principal.
Referencia: A concise example de usar GCD y administrar el fondo frente al hilo principal.
Normalmente, el método reloadData actualiza la vista de la tabla. ¿Podría poner una muestra de su código TableViewController? –