Как получить общее количество ежедневных калорий (активный + отдых) из аптечки - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь выучить Swift и понять аптечку, но я дошел до того, что застрял.

Я могу получить как базовую энергию, так и активную энергию из аптечки, но я не знаю, как объединить их для полной сожженной энергии. Я знаю, что вы можете получить это из объекта тренировки, но вы не можете получить к нему доступ, не так ли?

Я использую эту функцию для получения значений за последние 30 дней в виде словарей:

// MARK: - GET CALORIES FOR TIMESPAN (30 days)
    func getEnergyTimespan(forDay days: Int, _ identifier: HKQuantityTypeIdentifier, completion: @escaping ((_ weight: Double?, _ date: Date?) -> Void)) {
        guard let identifierType = HKObjectType.quantityType(forIdentifier: identifier) else {
            print("*** Unable to create the matching type ***")
            return
        }

        let now = Date()
        let startDate = Calendar.current.date(byAdding: DateComponents(day: -days), to: now)!

        var interval = DateComponents()
        interval.day = 1

        var anchorComponents = Calendar.current.dateComponents([.day, .month, .year], from: now)
        anchorComponents.hour = 0
        let anchorDate = Calendar.current.date(from: anchorComponents)!

        let query = HKStatisticsCollectionQuery(quantityType: identifierType,
                                                quantitySamplePredicate: nil,
                                                options: [.mostRecent],
                                                anchorDate: anchorDate,
                                                intervalComponents: interval)
        query.initialResultsHandler = { _, results, error in
            guard let results = results else {
                print("ERROR")
                return
            }

            results.enumerateStatistics(from: startDate, to: now) { statistics, _ in
                if let sum = statistics.mostRecentQuantity() {
                    let identifierValue = sum.doubleValue(for: HKUnit.kilocalorie())
                    completion(identifierValue, statistics.startDate)
                    return
                }
            }
        }
        healthKitDataStore!.execute(query)
    }

и назовите его следующим образом:

getEnergyTimespan(forDay: 30, .activeEnergyBurned) {totalCals, date   in
                guard let totalCals = totalCals else { return }
                let dateValue = DateFormatter.localizedString(from: date!, dateStyle: .short, timeStyle: .none)
                self.activeEnergyBurnedTimespan[dateValue] = totalCals
                self.activeEnergyCount.append(TimespanObject(date: dateValue, value: totalCals))

            }

            getEnergyTimespan(forDay: 30, .basalEnergyBurned) {totalCals, date   in
                guard let totalCals = totalCals else { return }
                let dateValue = DateFormatter.localizedString(from: date!, dateStyle: .short, timeStyle: .none)
                self.basalEnergyBurnedTimespan[dateValue] = totalCals
                self.basalEnergyCount.append(TimespanObject(date: dateValue, value: totalCals))
            }

В результате у меня останутся два словаря с ключом: значения типа "11/08/2019": 1345.0 (дата, калории)

Как лучше всего объединить эти два словаря? Они используют одни и те же ключи (дату), но я хочу объединить значения.

Или есть ли лучший способ запросить общее потребление энергии за день / промежуток времени?

Благодарен за ответыи предложения.

...