CMPedometer queryPedometerData(), возвращающий 0 шагов, если шаги существуют
Кажется, есть ошибка в методе CMPedometer queryPedometerData(). Метод возвращает 0 шагов для определенного времени окончания, но тот же запрос с отметкой времени 1 секунда выше или ниже возвращает правильное количество шагов
например
self.getStepsBetweenDates(NSDate(timeIntervalSince1970: 1543392126) as Date, date2: NSDate(timeIntervalSince1970: 1543393044) as Date) returns (Int) 1488
self.getStepsBetweenDates(NSDate(timeIntervalSince1970: 1543392126) as Date, date2: NSDate(timeIntervalSince1970: 1543393045) as Date) returns (Int) 0
self.getStepsBetweenDates(NSDate(timeIntervalSince1970: 1543392126) as Date, date2: NSDate(timeIntervalSince1970: 1543393046) as Date) returns (Int) 1488
Метод getStepsBetweenDates выглядит следующим образом
func getStepsBetweenDates(_ date1: Date, date2: Date) -> Int{
let group = DispatchGroup()
group.enter()
var steps = 0
self.pedometer.queryPedometerData(from: date1, to: date2, withHandler: {
pData, error in
if let e = error{
print("Error querying pedometer", e.localizedDescription)
}else{
if let data = pData{
steps = Int(data.numberOfSteps)
}
group.leave()
}
})
_ = group.wait(timeout: DispatchTime.distantFuture)
return steps
}
0 ответов
queryPedometerData
это асинхронный вызов
Обычно вы не хотите возвращать шаги в getStepsBetweenDates
вызов, потому что это асинхронный.
Если вы изменили var steps = 0
в var steps = [some random int]
тогда, скорее всего, вы получите это число вместо 0 из-за установленного условия гонки.
Более идеальным вариантом было бы реализовать ваш код как замыкание / обратный вызов или другую форму асинхронной обработки.
например:
self.pedometer.queryPedometerData(from: date1, to: date2) { (data, error) in
// Do something here with data.numberOfSteps
}
Вот статья на Medium об асинхронном коде:
https://medium.com/ios-os-x-development/managing-async-code-in-swift-d7be44cae89f