斯威夫特3精确计时器重复(iOS 9)
问题描述:
我有一个精确的计时器,需要更新每40毫秒(尽可能最精确)。在iOS10这很好(我使用新的scheduleRepeating
方法),但在iOS9我需要使用旧的方式(scheduledTimer
),它非常滞后(有时24ms,有时它72 ...),所以我的硬件接口和视觉效果和滞后。斯威夫特3精确计时器重复(iOS 9)
有什么建议吗?
func launchTimer() {
if #available(iOS 10.0, *) {
startTickTimer()
} else {
let timerQueue = DispatchQueue(label: "my.queue.tickTimer", attributes: .concurrent)
self.swiftTimer = Timer.scheduledTimer(timeInterval: period, target: self, selector: #selector(executeTimer), userInfo: nil, repeats: true)
timerQueue.async {
RunLoop.current.add(self.swiftTimer!, forMode: RunLoopMode.defaultRunLoopMode)
}
}
}
static func startTickTimer() {
let queue = DispatchQueue(label: "my.queue.tickTimer", attributes: .concurrent)
DMXTimer.tickTimer?.cancel()
DMXTimer.tickTimer = DispatchSource.makeTimerSource(queue: queue)
DMXTimer.tickTimer?.scheduleRepeating(deadline: .now(), interval: .milliseconds(40), leeway: .seconds(1))
DMXTimer.tickTimer?.setEventHandler {
executeTimer()
}
DMXTimer.tickTimer?.resume()
}
static func executeTimer() {
print("hello moto")
}
答
从苹果DOC约NSTimer
:
计时器不是实时的机制。如果在长时间循环标注期间或运行循环处于 未监控定时器的模式下,发生定时器的触发时间 ,定时器将不会触发,直到运行循环检测到定时器的下一次时间 。因此,计时器触发的实际时间可能会晚得多。另请参阅定时器公差。
如果你想有一个非常精确的计时器可以从Apple Tech Note检查的实施和斯威夫特适应或使用CADisplayLink
用于显示更新。
答
我会建议使用NSThread
和循环内部而不是定时器。这是更复杂的,但是,恕我直言,它有更多的设置和灵活的行为