У меня есть приложение, которое считывает данные об окружающей среде с USB-датчика, подключенного к Mac.Пользователи могут настроить частоту выборки данных приложением, а также частоту их усреднения и записи среднего значения в файл.
Сначала я использовал NSTimer
, но это было крайне неточно, особенно когда дисплей перешел в спящий режим.Сейчас я использую DispatchSourceTimer
, но он по-прежнему теряет 1 миллисекунду каждые 21-23 секунды, что составляет около 1 секунды каждые 6 часов или около того.В идеале я бы хотел, чтобы это было менее 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
}
}
}