2013-05-18 7 views
5

Supponiamo che io chiamo dispatch_async() tre volte al fine:La coda Grand Central Dispatch principale è seriale o concomitante?

dispatch_async(dispatch_get_main_queue(), 
     ^{ 
      [self doOne]; 
}); 

// some code here 

dispatch_async(dispatch_get_main_queue(), 
     ^{ 
      [self doTwo]; 
}); 

// more code here 

dispatch_async(dispatch_get_main_queue(), 
     ^{ 
      [self doThree]; 
}); 

sarà questo sempre essere eseguito come

[self doOne], [self doTwo], quindi [self doThree], o è l'ordine è garantito?

In questo caso, la domanda probabilmente è se la coda principale è seriale o concomitante.

risposta

13

Dalla documentazione:

dispatch_get_main_queue

Restituisce la coda di invio seriale associato a thread principale dell'applicazione.

così la coda principale è una serie coda e [self doOne], [self doTwo], [self doThree] sono eseguite in sequenza in questo ordine.

+2

Inoltre, deve essere seriale poiché i blocchi vengono eseguiti sullo stesso thread. Non è possibile che un singolo thread possa eseguire contemporaneamente più blocchi. – Sven

+1

@Rob Sì, ma i blocchi inviati alla coda principale verranno eseguiti nel thread principale. Questo è l'intero punto della coda principale. Le code non eseguono blocchi, ciò accade sempre in alcuni thread. Di solito un thread privato gestito da GCD, ma il thread principale per la coda principale. – Sven

+0

@Sven Mi hai frainteso. Il mio punto è semplicemente quello di chiarire che questo è vero per la coda principale, non applicabile alle code in generale. – Rob