El envío de un bloque a la cola principal generalmente se realiza desde una cola en segundo plano para indicar que ha finalizado algún procesamiento en segundo plano, por ejemplo
- (void)doCalculation
{
//you can use any string instead "com.mycompany.myqueue"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(backgroundQueue, ^{
int result = <some really long calculation that takes seconds to complete>;
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult:result];
});
});
}
En este caso, estamos haciendo un cálculo largo en una cola en segundo plano y necesitamos actualizar nuestra interfaz de usuario cuando se complete el cálculo. La actualización de la interfaz de usuario normalmente debe realizarse desde la cola principal, por lo que 'señalizamos' de nuevo a la cola principal utilizando un segundo dispatch_async anidado.
Probablemente hay otros ejemplos en los que es posible que desee volver a la cola principal, pero generalmente se hace de esta manera, es decir, anidada desde un bloque enviado a una cola en segundo plano.
- procesamiento en segundo plano terminado -> actualizar la interfaz de usuario
- fragmento de datos procesados en la cola de fondo -> señalizar la cola principal para comenzar el siguiente fragmento
- datos de red entrantes en la cola de fondo -> señalizar la cola principal de que el mensaje ha llegado
- etcétera etcétera
En cuanto a por qué es posible que desee enviar a la cola principal desde la cola principal ... Bueno, generalmente no lo haría, aunque posiblemente podría hacerlo para programar algún trabajo para la próxima vez en el ciclo de ejecución.