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()
你在哪裏檢查值?這是一個異步函數,因此該值僅在完成處理程序內有效。 –
基本上,我將變量todaysSteps設置爲等於我的結果數,然後將todaySteps與完成處理程序之外的其他東西進行比較。但它總是出現到0.0 – LFHS
看看異步編程。這是它應該如何工作的。如果您確實無法處理完成處理程序中的值,那麼我可以告訴您如何僅在DispatchGroups實際可用時才使用DispatchGroups,但您仍然無法使用該值,就好像它是從一個同步功能。 –