2012-03-07 13 views
48

Entre algunas otras maneras, existen estas dos maneras de conseguir colas en GCD:¿Cuál es la diferencia entre la "cola global" y la "cola principal" en GCD?

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

dispatch_get_main_queue(); 

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

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

Respuesta

66

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

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

A diferencia de la cola o colas principal asignado con dispatch_queue_create(), las colas concurrentes globales fechadores tan pronto como hilos estén disponibles (orden de finalización "no FIFO"). Los concurrentes globales colas representan tres bandas prioritarias:

 • DISPATCH_QUEUE_PRIORITY_HIGH 
     • DISPATCH_QUEUE_PRIORITY_DEFAULT 
     • DISPATCH_QUEUE_PRIORITY_LOW 

Bloques envía a la cola global de alta prioridad se invocará antes de las presentadas en el valor predeterminado o baja prioridad colas globales. Los bloques enviados a la cola global de baja prioridad solo serán invocados 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.

+0

¿Es correcto decir que las colas globales son colas concurrentes y no puede crear sus propias colas concurrentes (con 'dispatch_queue_create' u otra cosa)? –

7

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"); 
       }); 
     }); 
21

Los 5 colas (4 fondo, 1 principal) todos tienen diferentes prioridades de los hilos (-[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 cuarta generación y el simulador en un MacBook Pro)

1

cola de distribución global:

  1. Tareas en cola concurrente ex ecutes concurrentemente [subprocesos de fondo]
  2. Las tareas se sigue inician en el orden en que fueron agregadas a la cola

cola de distribución principal:

  1. Disponible cola de serie que ejecuta tareas en la principal la aplicación hilo.
  2. Suele invocarse desde una cola de fondo cuando ha finalizado algún proceso de fondo y se debe actualizar la interfaz de usuario .
Cuestiones relacionadas