Swift 3精确定时器重复(iOS 9)

时间:2017-05-19 09:41:13

标签: ios swift timer ios9 nstimer

我有一个精确的计时器需要每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")
}

2 个答案:

答案 0 :(得分:0)

来自Apple doc NSTimer

  

计时器不是实时机制。如果计时器的发射时间发生   在长时间运行循环调用期间或运行循环处于某种模式时   不监视计时器,计时器直到下次才开火   运行循环检查计时器。因此,实际的时间是一个   计时器起火可能会晚得多。另见Timer Tolerance。

如果你想要一个非常精确的计时器,你可以从Apple Tech Note检查一个实现,并在Swift中适应或使用CADisplayLink进行显示更新。

答案 1 :(得分:0)

我建议使用NSThread并在内部循环而不是计时器。它更复杂但是,imho,它有更多的设置和灵活的行为