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ącdispatch_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?
Więc to nie ma nic wspólnego z dispatch_sync wtedy? Tylko flaga używana podczas tworzenia? –
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. –
Dziękuję, te nazwy api są nieco mylące. Uratowałem mój dzień! :) –