DispatchQueue не ведет себя как последовательная очередь

#ios #swift #grand-central-dispatch #dispatch-queue

#iOS #swift #grand-central-dispatch #отправка-очередь

Вопрос:

Используя следующий код, я ожидаю, что при каждом вызове функции минимальное время между выполнением будет составлять 3-4 секунды.

Но: когда я вызываю writeData() 4 раза подряд, я вижу, что асинхронный блок выполняется, не дожидаясь завершения предыдущего вызова.

 func writeData(){
    DispatchQueue(label: "be.io").asyncAfter(deadline: .now()   1) {
        print("START :(Int64((Date().timeIntervalSince1970 * 1000.0).rounded()))")
        Thread.sleep(forTimeInterval: 3)
    }
}
...
writeData()
writeData()
writeData()
writeData()
 

Ожидаемый результат должен быть примерно таким:

 START :1611250630000
START :1611250634000
START :1611250638000
START :1611250642000
 

но при выполнении я получаю одинаковую временную метку (разница в ~ 1 миллисекунду) для всех 4 вызовов.

 START :1611250630000
START :1611250630000
START :1611250630000
START :1611250630000
 

Что я делаю не так?

P.S Я попробовал асинхронный без задержек, но безуспешно.

Ответ №1:

DispatchQueue(label: "be.io") будет создавать новый экземпляр каждый раз, когда вы его вызываете

Чтобы получить то, что вы ожидаете, сделайте его экземпляром var, например

 let mySerialQueue = DispatchQueue(label: "be.io") 
 

Комментарии:

1. Подтверждено! Проблема заключается в повторной инициализации нового DispatchQueue при каждом вызове. Переменная экземпляра класса сделала свое дело. Спасибо!