尝试使用HealthKit获取步骤,但总是返回0.0
问题描述:
我试图从半小时前获取步骤,并且正在使用讨论的方法here。下面是我的代码:尝试使用HealthKit获取步骤,但总是返回0.0
func getSteps(completion: @escaping (Double) -> Void) {
let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let now = Date()
let calendar = Calendar.current
let halfHourAgoDate = calendar.date(byAdding: .minute, value: -30, to: now)
if let date = halfHourAgoDate {
let predicate = HKQuery.predicateForSamples(withStart: date, end: now, options: .strictStartDate)
let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (_, result, error) in
var resultCount = 0.0
guard let result = result else {
completion(resultCount)
return
}
if let sum = result.sumQuantity() {
resultCount = sum.doubleValue(for: HKUnit.count())
return
}
DispatchQueue.main.async {
completion(resultCount)
}
}
healthStore.execute(query)
} else {
print("Error MainVC, date is being cast as nil")
}
}
当我真正尝试获取步骤,这是我的代码:
var todaysSteps: Double = 0
getSteps(completion: { (resultCount) -> Void in
todaysSteps = resultCount
})
print(todaysSteps) // always comes out to 0.0
然而,每当我运行此代码,该代码返回0.0。我启用了HealthKit,并授权它执行步骤,所以我不确定原因是什么。另外请注意,这是在我的变量声明:
let healthStore = HKHealthStore()
答
对于任何人遇到同样的问题,你需要做的完成处理程序中的代码,所以:
var todaysSteps: Double = 0
getSteps(completion: { (resultCount) -> Void in
print(resultCount)
})
你在哪里检查值?这是一个异步函数,因此该值仅在完成处理程序内有效。 –
基本上,我将变量todaysSteps设置为等于我的结果数,然后将todaySteps与完成处理程序之外的其他东西进行比较。但它总是出现到0.0 – LFHS
看看异步编程。这是它应该如何工作的。如果您确实无法处理完成处理程序中的值,那么我可以告诉您如何仅在DispatchGroups实际可用时才使用DispatchGroups,但您仍然无法使用该值,就好像它是从一个同步功能。 –