我有以下启动和停止计时器的代码.
private var timer: Timer? = nil
private func startTimer() {
if (timer != nil) {
return
}
logger.error("Starting timer on \(Thread.current)")
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { timer in
self.logger.error("Timer fired on \(Thread.current)")
})
}
private func stopTimer() {
if (timer == nil) {
return
}
logger.error("Stopping timer on \(Thread.current)")
timer?.invalidate()
timer = nil
}
计时器将多次启动和停止.我遇到了一个问题,它第一次按预期开始和停止,但第二次启动计时器时,它永远不会触发.下面是我从应用程序的两次连续运行中看到的日志(log).您可以看到,在第二次运行计时器后,从未调用过"Timer fired".
运行1:
Starting timer on <_NSMainThread: 0x2829e4140>{number = 1, name = main}
Timer fired on <_NSMainThread: 0x2829e4140>{number = 1, name = main}
Timer fired on <_NSMainThread: 0x2829e4140>{number = 1, name = main}
Timer fired on <_NSMainThread: 0x2829e4140>{number = 1, name = main}
Stopping timer on <_NSMainThread: 0x2829e4140>{number = 1, name = main}
Starting timer on <NSThread: 0x2829ecf00>{number = 10, name = (null)}
运行2:
Starting timer on <_NSMainThread: 0x281cb8400>{number = 1, name = main}
Timer fired on <_NSMainThread: 0x281cb8400>{number = 1, name = main}
Timer fired on <_NSMainThread: 0x281cb8400>{number = 1, name = main}
Stopping timer on <_NSMainThread: 0x281cb8400>{number = 1, name = main}
Starting timer on <NSThread: 0x281cbc140>{number = 8, name = (null)}
为什么计时器不会在第二次计时器响起?目前我能想到的唯一潜在的领先优势就是线索.现在,计时器的停止和随后的重新启动可能不会在主线程上发生,并且Invalify()的文档说明应该在启动计时器的同一线程上调用它.因此,另一个问题是,我如何确保在同一线程上调用了Start和Stop(不必是主线程)?谢谢