我有一个应用程序,可以从连接到Mac的USB传感器读取环境数据。用户可以配置应用程序对数据进行采样的频率,以及应用程序对这些采样进行平均并将平均值记录到文件中的频率。
我第一次使用NSTimer
,但这非常不准确,尤其是当显示器进入睡眠状态时。我现在使用DispatchSourceTimer
,但它仍然每21-23秒损失1毫秒,大约每6小时损失1秒。我希望每天少于1秒。
有什么想法可以让我把计时器调得更准确一点吗?
func setupTimer() -> DispatchSourceTimer {
let timer = DispatchSource.makeTimerSource(flags: .strict, queue: nil)
let repeatInterval = DispatchTimeInterval.seconds(samplingInterval)
let deadline : DispatchTime = .now() + repeatInterval
timer.schedule(deadline: deadline, repeating: repeatInterval, leeway: .nanoseconds(0))
timer.setEventHandler(handler: self.collectPlotAndLogDatapoint)
return timer
}
func collectPlotAndLogDatapoint() {
samplingIntervalCount += 1
let dataPoint : Float = softwareLoggingDelegate?.getCurrentCalibratedOutput() ?? 0
accumulatedTotal += dataPoint
if samplingIntervalCount == loggingInterval / samplingInterval{
let average = self.accumulatedTotal/Float(self.samplingIntervalCount)
DispatchQueue.global().async {
self.logDataPoint(data: average)
self.chartControls.addPointsToLineChart([Double(average)], Date().timeIntervalSince1970)
self.samplingIntervalCount = 0
self.accumulatedTotal = 0
}
}
}
对此的回答(以及回应的评论(似乎表明,在Swift:中很难获得亚毫秒精度
如何在Swift中实现非常准确的计时?
苹果显然有自己的待办事项;高精度定时器的注意事项:https://developer.apple.com/library/archive/technotes/tn2169/_index.html
对于环境传感器来说,每天3-4秒是非常准确的,我想这只会对那些想要在<lt;1秒。