Проблема с созданием последовательной очереди в Swift с использованием GCD - PullRequest
0 голосов
/ 21 января 2019

У меня есть очередь с последовательным интерфейсом, например, Bellow

var serialQueue = DispatchQueue(label: "com.serial.queue")

, и я использую ее следующим образом:

serialQueue.sync(execute: {
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2.0) {
                print("First Task")

            }
        })



serialQueue.sync(execute: {
                DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1.0) {
                      print("Second Task")
                  }
            })

Ожидается: первая задача, вторая задача

Но это печатает: Второе задание, первое задание

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Попробуйте это

var time = DispatchTime.now() + 0.2

serialQueue.sync(execute: {
        DispatchQueue.main.asyncAfter(deadline: time) {
            print("First Task")
        }
    })


time = time + 0.1

serialQueue.sync(execute: {
            DispatchQueue.main.asyncAfter(deadline: time) {
                  print("Second Task")
              }
        })
0 голосов
/ 23 января 2019

Это потому, что при вызове DispatchQueue.main.asyncAfter вы задерживаете печать «Второй задачи» на одну секунду и печать «Первая задача» на 2 секунды. Итак, через 1 секунду вы получите «Второе задание», а через 1 секунду «Первое задание».

Вы можете вызвать print напрямую в serialQueue или, если вам нужно сделать это в главном потоке, просто уберите задержку.

...