我有一个精确的计时器需要每40ms更新一次(最精确的可能)。在 iOS10 上它很好(我使用新的scheduleRepeating
方法)但在 iOS9 上我需要使用旧方法(scheduledTimer
)它非常滞后(有时24毫秒,有时它的72 ...),所以我的硬件界面和视觉效果和滞后。
有什么建议吗?
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")
}
答案 0 :(得分:0)
来自Apple doc NSTimer
:
计时器不是实时机制。如果计时器的发射时间发生 在长时间运行循环调用期间或运行循环处于某种模式时 不监视计时器,计时器直到下次才开火 运行循环检查计时器。因此,实际的时间是一个 计时器起火可能会晚得多。另见Timer Tolerance。
如果你想要一个非常精确的计时器,你可以从Apple Tech Note检查一个实现,并在Swift中适应或使用CADisplayLink
进行显示更新。
答案 1 :(得分:0)
我建议使用NSThread
并在内部循环而不是计时器。它更复杂但是,imho,它有更多的设置和灵活的行为