Swift 如何打印我刚刚记录并保存到Healthkit store的HKQuantity类型的值?

Swift 如何打印我刚刚记录并保存到Healthkit store的HKQuantity类型的值?,swift,healthkit,watchos,heartbeat,Swift,Healthkit,Watchos,Heartbeat,我正在向HKStore分享一项训练,我要求阅读以下类型: let typesToRead: Set = [ HKQuantityType.quantityType(forIdentifier: .heartRate)!, HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned)!, HKQuantityType.quantityType(forIdentifier: .distanceWalkingRu

我正在向HKStore分享一项训练,我要求阅读以下类型:

let typesToRead: Set = [
    HKQuantityType.quantityType(forIdentifier: .heartRate)!,
    HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned)!,
    HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning)!
]
在我的训练课程中,跟踪和记录活动训练,我能够记录实时数据并将其保存到HealthStore,但我不知道如何读取数据并将其显示在屏幕上,以便用户在训练期间查看实时数据。或者至少在控制台中打印心率、activeEnergyBurned等数据

以下是HKLiveWorkoutBuilderDelegate,它似乎正在共享相关的训练数据

// MARK: HKLiveWorkoutBuilderDelegate
func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {
    for type in collectedTypes {
        guard let quantityType = type as? HKQuantityType else {
            return // Nothing to do
        }

        let statistics = workoutBuilder.statistics(for: quantityType)
        let typeDescription = type.description

    }
}

注意:我使用的是Apple new Beta WatchOS 5.0,您正在做大部分事情,但还需要启用数据源的数据收集功能。在我的应用程序中,我收集距离和心率数据,我这样做:

let dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)

if let hr = HKQuantityType.quantityType(forIdentifier: .heartRate) {
    dataSource.enableCollection(for: hr, predicate: nil)
}
if let distance = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning) {
    dataSource.enableCollection(for: distance, predicate: nil)
}

workoutBuilder?.dataSource = dataSource
func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {

    guard let hrType = HKQuantityType.quantityType(forIdentifier: .heartRate),
        let distanceType = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning) else {
            return
    }

    if collectedTypes.contains(hrType) {
        if let hrQuantity = workoutBuilder.statistics(for: hrType)?.mostRecentQuantity() {
            // We want to have BPM
            let hrUnit = HKUnit(from: "count/min")
            let hr = Int(hrQuantity.doubleValue(for: hrUnit))

            debugPrint("HR: \(hr)")
        }
    }

    if collectedTypes.contains(distanceType) {
        if let distQuantity = workoutBuilder.statistics(for: distanceType)?.sumQuantity() {
            // We want to have total distance in meters
            let distance = distQuantity.doubleValue(for: HKUnit.meter())

            debugPrint("Distance: \(distance) m")
        }
    }
}
然后我可以在HKLiveWorkoutBuilderDelegate方法中打印该信息,如下所示:

let dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)

if let hr = HKQuantityType.quantityType(forIdentifier: .heartRate) {
    dataSource.enableCollection(for: hr, predicate: nil)
}
if let distance = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning) {
    dataSource.enableCollection(for: distance, predicate: nil)
}

workoutBuilder?.dataSource = dataSource
func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {

    guard let hrType = HKQuantityType.quantityType(forIdentifier: .heartRate),
        let distanceType = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning) else {
            return
    }

    if collectedTypes.contains(hrType) {
        if let hrQuantity = workoutBuilder.statistics(for: hrType)?.mostRecentQuantity() {
            // We want to have BPM
            let hrUnit = HKUnit(from: "count/min")
            let hr = Int(hrQuantity.doubleValue(for: hrUnit))

            debugPrint("HR: \(hr)")
        }
    }

    if collectedTypes.contains(distanceType) {
        if let distQuantity = workoutBuilder.statistics(for: distanceType)?.sumQuantity() {
            // We want to have total distance in meters
            let distance = distQuantity.doubleValue(for: HKUnit.meter())

            debugPrint("Distance: \(distance) m")
        }
    }
}