iphone ios concurrency grand-central-dispatch

iphone - ¿Cuál es la diferencia entre la "cola global" y la "cola principal" en GCD?



ios concurrency (4)

Entre otras formas, existen estas dos formas de obtener colas en GCD :

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_get_main_queue();

Si no estoy completamente equivocado, la "cola principal" se está ejecutando en el hilo principal y es buena para los bloques de "devolución de llamada" que ejecutan el trabajo de IU.

¿Significa esto que una "cola global" es una que se ejecuta en un hilo de fondo?


Cola de envío global:

  1. Las tareas en cola concurrente se ejecutan simultáneamente [hilos de fondo]
  2. Las tareas aún se inician en el orden en que se agregaron a la cola

Cola de despacho principal:

  1. Cola en serie disponible que ejecuta tareas en el hilo principal de la aplicación.
  2. Por lo general, se llama desde una cola de fondo cuando ha finalizado un procesamiento en segundo plano y la interfaz de usuario debe actualizarse.

La cola principal se ejecuta en el hilo principal como dices.

Las colas globales son colas concurrentes y desde la página principal de dispatch_get_global_queue:

A diferencia de la cola principal o las colas asignadas con dispatch_queue_create (), las colas simultáneas globales programan bloques tan pronto como los subprocesos están disponibles (orden de finalización "no FIFO"). Las colas simultáneas globales representan tres bandas de prioridad:

• DISPATCH_QUEUE_PRIORITY_HIGH • DISPATCH_QUEUE_PRIORITY_DEFAULT • DISPATCH_QUEUE_PRIORITY_LOW

Los bloques enviados a la cola global de alta prioridad se invocarán antes que los enviados a las colas globales predeterminadas o de baja prioridad. Los bloques enviados a la cola global de baja prioridad solo se invocarán si no hay bloques pendientes en las colas predeterminadas o de alta prioridad.

Por lo tanto, son colas que se ejecutan en subprocesos de fondo a medida que están disponibles. No son "FIFO", por lo que el pedido no está garantizado.


Las 5 colas (4 de fondo, 1 principal) tienen diferentes prioridades de subprocesos ( -[NSThread threadPriority] ) también:

-main- : 0.758065 DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258 DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000 DISPATCH_QUEUE_PRIORITY_LOW : 0.467742 DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000

(probado en un iPod de cuarta generación y el simulador en un MacBook Pro)


Sí. Puede ejecutar código como este en un dispositivo para probarlo:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"Block 1a"); NSAssert(![NSThread isMainThread], @"Wrong thread!"); NSLog(@"Block 1b"); }); dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"Block 2a"); NSAssert([NSThread isMainThread], @"Wrong thread!"); NSLog(@"Block 2b"); }); });