Аптечка в час Сводка активности, содержащая шаги, расстояние и калории? - PullRequest
0 голосов
/ 25 марта 2019

Запрос Healthkit должен вернуть объект массива, который содержит шаги, расстояние и калории.

Я смог вернуть их по отдельности,
Шаг активности / час

func activitySteps(_ startDate:NSDate, endDate:NSDate, anchorDate:NSDate, completion: @escaping (Array<NSObject>, NSError?) -> ()) {
    let type = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)
    let interval = NSDateComponents()
    interval.hour = 1

    let predicate = HKQuery.predicateForSamples(withStart: startDate as Date, end: endDate as Date, options: .strictEndDate)
    let query = HKStatisticsCollectionQuery(quantityType: type!, quantitySamplePredicate: predicate, options: [.cumulativeSum], anchorDate: anchorDate as Date, intervalComponents:interval as DateComponents)

    query.initialResultsHandler = { query, results, error in
      if let myResults = results{
        var stepsArray: [NSObject] = []
        myResults.enumerateStatistics(from: startDate as Date, to: endDate as Date) {
          statistics, stop in

          if let quantity = statistics.sumQuantity() {
            let steps = quantity.doubleValue(for: HKUnit.count())
//            print("\(statistics.endDate.timeIntervalSince1970): steps = \(steps)")

            let ret =  [
              "steps": steps,
              "startDate" : statistics.startDate.timeIntervalSince1970 * 1000.0,
              "endDate": statistics.endDate.timeIntervalSince1970 * 1000.0
              ] as [String : Any]
            stepsArray.append(ret as NSObject)
          }
        }
        completion(stepsArray, error as NSError?)
      }
    }

    healthKitStore.execute(query)
  }


Активность Расстояние / час

func activityDistance(_ startDate:NSDate, endDate:NSDate, anchorDate:NSDate, completion: @escaping (Array<NSObject>, NSError?) -> ()) {
    let type = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)
    let interval = NSDateComponents()
    interval.hour = 1

    let predicate = HKQuery.predicateForSamples(withStart: startDate as Date, end: endDate as Date, options: .strictEndDate)
    let query = HKStatisticsCollectionQuery(quantityType: type!, quantitySamplePredicate: predicate, options: [.cumulativeSum], anchorDate: anchorDate as Date, intervalComponents:interval as DateComponents)

    query.initialResultsHandler = { query, results, error in
      if let myResults = results{
        var distanceArray: [NSObject] = []
        myResults.enumerateStatistics(from: startDate as Date, to: endDate as Date) {
          statistics, stop in

          if let quantity = statistics.sumQuantity() {
            let distance = quantity.doubleValue(for: HKUnit.meter())
            print("\(statistics.endDate.timeIntervalSince1970): distance = \(distance)")

            let ret =  [
              "distance": distance,
              "startDate" : statistics.startDate.timeIntervalSince1970 * 1000.0,
              "endDate": statistics.endDate.timeIntervalSince1970 * 1000.0
              ] as [String : Any]
            distanceArray.append(ret as NSObject)
          }
        }
        completion(distanceArray, error as NSError?)
      }
    }

    healthKitStore.execute(query)
  }

калорий активности / час

func activityCalories(_ startDate:NSDate, endDate:NSDate, anchorDate:NSDate, completion: @escaping (Array<NSObject>, NSError?) -> ()) {
    let type = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.activeEnergyBurned)
    let interval = NSDateComponents()
    interval.hour = 1

    let predicate = HKQuery.predicateForSamples(withStart: startDate as Date, end: endDate as Date, options: .strictEndDate)
    let query = HKStatisticsCollectionQuery(quantityType: type!, quantitySamplePredicate: predicate, options: [.cumulativeSum], anchorDate: anchorDate as Date, intervalComponents:interval as DateComponents)

    query.initialResultsHandler = { query, results, error in
      if let myResults = results{
        var caloriesArray: [NSObject] = []
        myResults.enumerateStatistics(from: startDate as Date, to: endDate as Date) {
          statistics, stop in

          if let quantity = statistics.sumQuantity() {
            let calories = quantity.doubleValue(for: HKUnit.kilocalorie())
            print("\(statistics.endDate.timeIntervalSince1970): calories = \(calories)")

            let ret =  [
              "calories": calories,
              "startDate" : statistics.startDate.timeIntervalSince1970 * 1000.0,
              "endDate": statistics.endDate.timeIntervalSince1970 * 1000.0
              ] as [String : Any]
            caloriesArray.append(ret as NSObject)
          }
        }
        completion(caloriesArray, error as NSError?)
      }
    }

    healthKitStore.execute(query)
  }

Вместо этого я хотел бы объединить все это в один объект.

 [
    {
         steps: 70,
         distance:10,
         calories: 200,
         startDate: ...,
         endDate: ...,
     },...
 ]

Можно ли генерировать данные в указанном формате с почасовым интервалом непосредственно из самого HealthKit? Если это невозможно, как я могу объединить все 3 данные в один объект, где данные могут варьироваться от одного дня до недели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...