我正在尝试从 HealthKit 获取给定日期的 stepsQuantityType 和 kjActiveQuantityType。
我可以让两个查询单独工作,但是当尝试在同一个函数中一起运行它们时,在第二个查询完成之前返回结果,给出一个索引超出范围错误,因为数组的索引 1 没有被填充。
任何帮助将不胜感激。
我使用调用函数
getTodaysStepsAndKJ { arrayData in
self.stepsHolder = arrayData[0]
self.kjHolder = arrayData[1] * 4.184
DispatchQueue.main.async {self.stepsLabel.text = arrayData[0].description;
self.kjLabel.text = (arrayData[1] * 4.184).description}
self.saveDataToCloud()
}
函数是
func getTodaysStepsAndKJ(completion: @escaping (Array<Double>) -> Void) {
let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let kjActiveQuantityType = HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned)!
var resultArray = Array<Double>();
let now = Date()
let startOfDay = Calendar.current.startOfDay(for: now)
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)
let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, _ in
guard let result = result, let sum = result.sumQuantity() else {
resultArray.insert(0.0, at: 0)
completion(resultArray)
return
}
resultArray.insert(sum.doubleValue(for: HKUnit.count()), at: 0)
completion(resultArray)
}
let query2 = HKStatisticsQuery(quantityType: kjActiveQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, _ in
guard let result = result, let sum = result.sumQuantity() else {
resultArray.insert(0.0, at: 1)
completion(resultArray)
return
}
resultArray.insert(sum.doubleValue(for: HKUnit.kilocalorie()), at: 1)
completion(resultArray)
}
healthStore.execute(query)
healthStore.execute(query2)
}
当拆分并作为两个函数运行时,它们都可以正常工作。