Забава c, возвращающаяся до завершения второго запроса аптечки - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь получить оба шагаQuantityType и kjActiveQuantityType на определенную дату из HealthKit.

Я могу заставить оба запроса работать, если интересно, но при попытке запустить их вместе в одной и той же функции правило возвращается до завершения второго запроса, что дает ошибку индекса вне диапазона, поскольку индекс 1 массива имеет не был заполнен.

Любая помощь будет принята с благодарностью.

Я называю забавой c, используя

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

, а забавой c является

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

При разделении и запуске в качестве двух функций они работают нормально.

1 Ответ

1 голос
/ 02 мая 2020

если вы берете 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)

  }
...