Я пытаюсь создать (сетевой) синхронизированный массив для компании, в которой я работаю. Хотя сетевая часть работает нормально, я остановился на проблеме.Последовательная очередь FIFO с использованием GCD
Мое желание было создать новую очередь с помощью dispatch_create_queue
, к которому я бы добавить два блока, которые не для запуска в главном потоке, но в последовательном порядке, а это означает, что сначала первый блок должен работать, затем второй, и никогда не параллельно.
Я прочитал документацию на яблоко, но это смущает, если не сказать больше.
Когда я создаю свою очередь с помощью
dispatch_queue_create
, а затем добавить блоки (после того, как они были определены) с использованиемdispatch_sync
, я обнаружил, что блок по-прежнему выполняется в главном потоке.При использовании
dispatch_async
, если блоки не выполняются в основном потоке.Когда я пытаюсь добавить оба блока, используя
dispatch_sync
Они блокируются навсегда.Единственный раз, когда оба блока работают нормально, а основной поток - при вызове
dispatch_async
.
Однако причина, почему я выбрал НОД и метод синхронизации так, чтобы я был под впечатлением, что я создавал новую очередь (и, таким образом, новый поток), и что добавление блоков в эту очередь будет просто блокировать один пока другой не закончил выполнение. Это не так, или создание очереди не гарантирует, что код не будет работать в основном потоке?
Так что не имеет ничего общего с dispatch_sync тогда? Только флаг используется при его создании? –
dispatch_async делает это так, чтобы сам вызов отправки не блокировался до завершения блока. Если вы используете dispatch_sync, сама задача выполняется в любом потоке, в котором находится очередь, но вы блокируете текущий поток, пока задача не будет выполнена. Я не думаю, что это то, что вам нужно. –
Спасибо, эти имена api немного запутывают. Спас мой день! :) –