0

我正在尝试从 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)
  }

当拆分并作为两个函数运行时,它们都可以正常工作。

4

1 回答 1

1

如果您在查询一中使用 query2 ... 那么它可以工作.. 大致类似于以下 ...未测试的代码

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)
           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(query2)
      }

    healthStore.execute(query)

  }
于 2020-05-02T12:28:08.317 回答