Ваш код не соответствует тому, что вы описываете: API scheduledTimer(withTimeInterval
неявно добавляет таймер к runl oop. Вы не должны самостоятельно добавлять таймер в runl oop. Итак, оба таймера работают на runl oop.
Рекомендую использовать DispatchSourceTimer
и кастом DispatchQueue
. Очередь по умолчанию является последовательной и работает как FIFO (первым пришел - первым вышел). Последовательная очередь гарантирует, что задачи не будут выполняться одновременно.
Таймеры приостанавливаются после создания. Вы должны вызвать activate()
(или resume()
в iOS 9 и ниже), чтобы запустить таймеры, например, в viewDidLoad
class Controller : UIViewController {
let queue = DispatchQueue(label: "myQueue")
lazy var timer1 : DispatchSourceTimer = {
let timer = DispatchSource.makeTimerSource(queue: queue)
timer.schedule(deadline:.now() + 1.0, repeating: 1.0)
timer.setEventHandler(handler: eventHandler1)
return timer
}()
lazy var timer2 : DispatchSourceTimer = {
let timer = DispatchSource.makeTimerSource(queue: queue)
timer.schedule(deadline:.now() + 0.5, repeating: 0.5)
timer.setEventHandler(handler: eventHandler2)
return timer
}()
override func viewDidLoad() {
super.viewDidLoad()
timer1.activate()
timer2.activate()
}
func eventHandler1() {
DispatchQueue.main.async {
// do stuff on the main thread
}
}
func eventHandler2() {
DispatchQueue.main.async {
// do stuff on the main thread
}
}
}
Свойства таймера объявляются лениво, чтобы избежать опций и закрытие обработчика событий (() -> Void
) реализовано как стандартные методы.