2012-03-07 14 views
48

Tra qualche altro modo, ci sono questi due modi per ottenere le code in GCD:Qual è la differenza tra "coda globale" e "coda principale" in GCD?

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

dispatch_get_main_queue(); 

Se io non sono del tutto sbagliato, la "coda di principale" è in esecuzione su thread principale ed è un bene per "callback "i blocchi che eseguono l'interfaccia utente funzionano.

Significa che una "coda globale" è quella che viene eseguita su un thread in background?

risposta

66

La coda principale viene effettivamente eseguita sul thread principale come dici tu.

Le code globali sono code concomitanti e dalla pagina principale per dispatch_get_global_queue:

differenza della coda o le code principale allocato con dispatch_queue_create(), le code simultanee globali blocchi di programmazione non appena discussioni diventano disponibili (ordine di completamento "non FIFO"). I concorrenti code globali rappresentano tre gruppi prioritari:

 • DISPATCH_QUEUE_PRIORITY_HIGH 
     • DISPATCH_QUEUE_PRIORITY_DEFAULT 
     • DISPATCH_QUEUE_PRIORITY_LOW 

blocchi inoltrato alla coda globale alta priorità verrà richiamato prima quelli sottoposti al predefinito o code globali bassa priorità. I blocchi inviati alla coda globale a bassa priorità saranno invocati solo se non vi sono blocchi in sospeso sulle code predefinite o ad alta priorità.

Quindi, sono code che vengono eseguite su thread in background non appena sono disponibili. Sono "non FIFO" quindi l'ordine non è garantito.

+0

È corretto dire che le code globali sono code concorrenti e non è possibile creare le proprie code concorrenti (con 'dispatch_queue_create' o qualcos'altro)? –

7

Sì. È possibile eseguire il codice come questo su un dispositivo per testarlo:

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

I 5 code (4 sfondo, 1 principale) tutti hanno differenti priorità dei thread (-[NSThread threadPriority]) anche:

      -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 

(Testato su un iPod 4th Gen e il simulatore su un MacBook Pro)

1

globale coda di spedizione:

  1. Compiti in simultanea coda di ex ecutes contemporaneamente [thread in background]
  2. Le attività vengono ancora avviati nell'ordine in cui sono stati aggiunti alla coda

coda di invio principale:

  1. Disponibile coda di serie che esegue i compiti sul del principale dell'applicazione filo.
  2. Viene solitamente chiamato da una coda di sfondo quando è terminata l'elaborazione in background e l'interfaccia utente deve essere aggiornata a .
Problemi correlati