2017-09-13 90 views
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() 
+0

你在哪裏檢查值?這是一個異步函數,因此該值僅在完成處理程序內有效。 –

+0

基本上,我將變量todaysSteps設置爲等於我的結果數,然後將todaySteps與完成處理程序之外的其他東西進行比較。但它總是出現到0.0 – LFHS

+0

看看異步編程。這是它應該如何工作的。如果您確實無法處理完成處理程序中的值,那麼我可以告訴您如何僅在DispatchGroups實際可用時才使用DispatchGroups,但您仍然無法使用該值,就好像它是從一個同步功能。 –

回答

1

對於任何人遇到同樣的問題,你需要做的完成處理程序中的代碼,所以:

var todaysSteps: Double = 0 
getSteps(completion: { (resultCount) -> Void in 
          print(resultCount) 
}) 
相關問題