CMPedometer queryPedometerData() 在步骤存在时返回 0 个步骤
CMPedometer queryPedometerData() returning 0 steps when steps exist
CMPedometer queryPedometerData() 方法中似乎存在错误。该方法在某些结束时间返回 0 个步骤,但时间戳高或低 1 秒的相同查询 returns 正确的步骤数
例如
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
}
queryPedometerData
是异步调用
通常您不希望 return getStepsBetweenDates
调用中的步骤,因为它是异步的。
如果您将 var steps = 0
更改为 var steps = [some random int]
,那么由于设置了竞争条件,您可能会得到该数字而不是 0。
更理想的是将您的代码实现为 closure/callback 或其他形式的异步处理。
例如:
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
CMPedometer queryPedometerData() 方法中似乎存在错误。该方法在某些结束时间返回 0 个步骤,但时间戳高或低 1 秒的相同查询 returns 正确的步骤数
例如
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
}
queryPedometerData
是异步调用
通常您不希望 return getStepsBetweenDates
调用中的步骤,因为它是异步的。
如果您将 var steps = 0
更改为 var steps = [some random int]
,那么由于设置了竞争条件,您可能会得到该数字而不是 0。
更理想的是将您的代码实现为 closure/callback 或其他形式的异步处理。
例如:
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