23

Próbuję utworzyć zsynchronizowaną (sieć) tablicę dla firmy, dla której pracuję. Podczas gdy praca w sieci działa dobrze, rozwinąłem problem.Kolejka szeregowa FIFO przy użyciu GCD

Moim życzeniem było, aby utworzyć nową kolejkę korzystając dispatch_create_queue, do której chciałbym dodać dwa bloki, które są nie uruchomić w głównym wątku, ale w sposób szeregowy, co oznacza, że ​​najpierw pierwszy blok ma biec, potem drugi i nigdy równolegle.

Przeczytałem dokumentację jabłka, ale jest to mylące co najmniej.

  • Kiedy tworzę moją kolejkę za pomocą dispatch_queue_create a następnie dodać bloki (po tym jak zostały zdefiniowane) używając dispatch_sync, I okazało się, że blok jest nadal wykonywany w głównym wątku.

  • Podczas korzystania z dispatch_async, to jest, gdy bloki nie są wykonywane w głównym wątku.

  • Kiedy próbuję dodać oba bloki za pomocą dispatch_sync Zostaną one zablokowane na zawsze.

  • Jedynym czasem, w którym oba bloki wydają się działać poprawnie i wyłączone z głównego wątku, jest wywołanie dispatch_async.

jednak przyczyna, wybraliśmy GCD i sposobu synchronizacji, tak że wrażenie, że było stworzenie nowego kolejkę (a zatem nowy gwint) i dodanie bloki tej kolejki po prostu blokować jeden dopóki drugi nie skończył wykonywania. Czy tak nie jest, czy tworzenie kolejki nie gwarantuje, że kod nie będzie działał w głównym wątku?

Odpowiedz

50

Jest to kolejka FIFO w GCD:

dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL); 

... 
dispatch_async(serialQueue, ^{ 
    //block1 
}); 

dispatch_async(serialQueue, ^{ 
    //block2 
}); 
+0

Więc to nie ma nic wspólnego z dispatch_sync wtedy? Tylko flaga używana podczas tworzenia? –

+5

Funkcja dispatch_async powoduje, że wywołanie nie blokuje się, dopóki blok nie zostanie zakończony. Jeśli używasz dispatch_sync, samo zadanie jest wykonywane w dowolnym wątku, w którym znajduje się kolejka, ale blokujesz bieżący wątek, dopóki zadanie nie zostanie wykonane. Nie sądzę, że tego właśnie potrzebujesz. –

+0

Dziękuję, te nazwy api są nieco mylące. Uratowałem mój dzień! :) –