#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 при каждом вызове. Переменная экземпляра класса сделала свое дело. Спасибо!