23

Я пытаюсь создать (сетевой) синхронизированный массив для компании, в которой я работаю. Хотя сетевая часть работает нормально, я остановился на проблеме.Последовательная очередь FIFO с использованием GCD

Мое желание было создать новую очередь с помощью dispatch_create_queue, к которому я бы добавить два блока, которые не для запуска в главном потоке, но в последовательном порядке, а это означает, что сначала первый блок должен работать, затем второй, и никогда не параллельно.

Я прочитал документацию на яблоко, но это смущает, если не сказать больше.

  • Когда я создаю свою очередь с помощью dispatch_queue_create, а затем добавить блоки (после того, как они были определены) с использованием dispatch_sync, я обнаружил, что блок по-прежнему выполняется в главном потоке.

  • При использовании dispatch_async, если блоки не выполняются в основном потоке.

  • Когда я пытаюсь добавить оба блока, используя dispatch_sync Они блокируются навсегда.

  • Единственный раз, когда оба блока работают нормально, а основной поток - при вызове dispatch_async.

Однако причина, почему я выбрал НОД и метод синхронизации так, чтобы я был под впечатлением, что я создавал новую очередь (и, таким образом, новый поток), и что добавление блоков в эту очередь будет просто блокировать один пока другой не закончил выполнение. Это не так, или создание очереди не гарантирует, что код не будет работать в основном потоке?

ответ

50

Это очереди FIFO в НОД:

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

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

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

Так что не имеет ничего общего с dispatch_sync тогда? Только флаг используется при его создании? –

+5

dispatch_async делает это так, чтобы сам вызов отправки не блокировался до завершения блока. Если вы используете dispatch_sync, сама задача выполняется в любом потоке, в котором находится очередь, но вы блокируете текущий поток, пока задача не будет выполнена. Я не думаю, что это то, что вам нужно. –

+0

Спасибо, эти имена api немного запутывают. Спас мой день! :) –

Смежные вопросы