Подтвердить что ты не робот

Последовательная очередь FIFO с использованием GCD

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Это очередь FIFO в GCD:

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

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

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