2013-05-18 5 views
5

Załóżmy Wzywam dispatch_async() trzy razy w kolejności:Czy główna kolejka Grand Central Dispatch jest seryjna czy współbieżna?

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]; 
}); 

Będzie to zawsze być wykonywane jak

[self doOne], [self doTwo], następnie [self doThree] lub jest zamówienie jest gwarantowany?

W tym przypadku pytanie prawdopodobnie jest takie, że główna kolejka jest ciągła lub równoległa.

Odpowiedz

13

Z dokumentacji:

dispatch_get_main_queue

Zwraca seryjny wysyłki kolejkę związaną z wątku głównego aplikacji.

więc głównym kolejka jest seryjny kolejka, a [self doOne], [self doTwo], [self doThree] są wykonywane kolejno w tej kolejności.

+2

Ponadto musi być szeregowy, ponieważ bloki działają na tym samym wątku. Nie ma możliwości, aby pojedynczy wątek mógł jednocześnie współdziałać z wieloma blokami. – Sven

+1

@Rob Tak, ale bloki przesłane do głównej kolejki zostaną wykonane w głównym wątku. To jest cały punkt głównej kolejki. Kolejki nie uruchamiają bloków, co zawsze dzieje się w pewnym wątku. Zazwyczaj wątek prywatny zarządzany przez GCD, ale główny wątek głównej kolejki. – Sven

+0

@Sven You źle mnie zrozumiałeś. Chodzi mi tylko o wyjaśnienie, że tak jest w przypadku głównej kolejki, która nie dotyczy ogólnie kolejek. – Rob