Ответ 1
Это очередь FIFO в GCD:
dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL);
...
dispatch_async(serialQueue, ^{
//block1
});
dispatch_async(serialQueue, ^{
//block2
});
Я пытаюсь создать (сетевой) синхронизированный массив для компании, в которой я работаю. Хотя сетевая часть работает нормально, я остановился на проблеме.
Мое желание состояло в том, чтобы создать новую очередь с помощью dispatch_create_queue
, к которой я бы добавил два блока, которые не для запуска в основном потоке, но последовательно, что означает, что сначала первый блок должен работать, затем второй и никогда не параллельно.
Я прочитал документацию на яблоко, но это смущает, если не сказать больше.
Когда я создаю свою очередь с помощью dispatch_queue_create
, а затем добавляю блоки (после их определения) с помощью dispatch_sync
, я обнаружил, что блок по-прежнему выполняется в основном потоке.
При использовании dispatch_async
, если блоки не выполняются в основном потоке.
Когда я пытаюсь добавить оба блока с помощью dispatch_sync
, они блокируются навсегда.
Единственный раз, когда оба блока, кажется, работают нормально, а основной поток - при вызове dispatch_async
.
Однако причина, по которой я выбрал GCD и метод синхронизации, чтобы у меня создалось впечатление, что я создаю новую очередь (и, следовательно, новый поток), и что добавление блоков в эту очередь будет просто блокировать одну, пока другая законченное исполнение. Это не так, или создание очереди не гарантирует, что код не будет работать в основном потоке?
Это очередь FIFO в GCD:
dispatch_queue_t serialQueue = dispatch_queue_create("com.blah.queue", DISPATCH_QUEUE_SERIAL);
...
dispatch_async(serialQueue, ^{
//block1
});
dispatch_async(serialQueue, ^{
//block2
});