斯威夫特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和循环内部而不是定时器。这是更复杂的,但是,恕我直言,它有更多的设置和灵活的行为