【问题标题】:Query real time heart rate variability and heart rate values查询实时心率变异性和心率值
【发布时间】:2020-05-28 08:06:34
【问题描述】:

我正在尝试从 Apple Watch 读取实时心率 + 心率变异性数据。 我能够读取 heartRate 值,但不知道如何实现 HRV 的读取。我可以让它们同时读出吗?

class HealthKitManager {

    private var healthStore = HKHealthStore()
    private var heartRateQuantity = HKUnit(from: "count/min")
    private var heartRateVariability = HKUnit(from: "count/min")
    private var activeQueries = [HKQuery]()

    @Published var heartRateValues = HeartRateValues()

    func autorizeHealthKit() {

        let heartRate = HKObjectType.quantityType(forIdentifier: .heartRate)!
        let heartRateVariability = HKObjectType.quantityType(forIdentifier: .heartRateVariabilitySDNN)!

        let HKreadTypes: Set = [heartRate, heartRateVariability]

        healthStore.requestAuthorization(toShare: nil, read: HKreadTypes) { (success, error) in
            if let error = error {
                print("Error requesting health kit authorization: \(error)")
            }
        }
    }

    func fetchHeartRateData(quantityTypeIdentifier: HKQuantityTypeIdentifier ) {

        let devicePredicate = HKQuery.predicateForObjects(from: [HKDevice.local()])
        let updateHandler: (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> Void = {
        query, samples, deletedObjects, queryAnchor, error in
            guard let samples = samples as? [HKQuantitySample] else {
                return
            }
            self.process(samples, type: quantityTypeIdentifier)
        }
        let query = HKAnchoredObjectQuery(type: HKObjectType.quantityType(forIdentifier: quantityTypeIdentifier)!, predicate: devicePredicate, anchor: nil, limit: HKObjectQueryNoLimit, resultsHandler: updateHandler)
        query.updateHandler = updateHandler
        healthStore.execute(query)
        activeQueries.append(query)
    }

    private func process(_ samples: [HKQuantitySample], type: HKQuantityTypeIdentifier) {
        for sample in samples {
            if type == .heartRate {
                DispatchQueue.main.async {
                    self.heartRateValues.heartRate = sample.quantity.doubleValue(for: self.heartRateQuantity)
                }
            } 
                // Not Sure about this part and readings show 0.0
                else if type == .heartRateVariabilitySDNN {
                DispatchQueue.main.async {
                    self.heartRateValues.heartRateVariability = sample.quantity.doubleValue(for: self.heartRateVariability)
                }
            }
        }
    }

    func stopFetchingHeartRateData() {
        activeQueries.forEach { healthStore.stop($0) }
        activeQueries.removeAll()
        DispatchQueue.main.async {
            self.heartRateValues.heartRate = 0.0
            self.heartRateValues.heartRateVariability = 0.0
        }

    }

}

这里提出了一个类似的问题,但没有得到答案: Get Apple watch heartRateVariabilitySDNN realtime?

【问题讨论】:

  • 复制问题不受欢迎。您可以投票赞成其他问题或提出赏金以吸引观众并在那里回答。
  • 这不是完全一样的问题。我想知道是否可以同时查询它们,以及如何做到这一点。

标签: swift healthkit


【解决方案1】:

我也设法得到了小时读数,只是补充说:

private func process(_ samples: [HKQuantitySample], type: HKQuantityTypeIdentifier) {
    for sample in samples {
        if type == .heartRate {
            DispatchQueue.main.async {
                self.heartRateValues.heartRate = sample.quantity.doubleValue(for: self.heartRateQuantity)
            }
        } else if type == .heartRateVariabilitySDNN {
            DispatchQueue.main.async {
                self.heartRateValues.heartRateVariability = sample.quantity.doubleValue(for: self.heartRateVariabilityQuantity)
            }
        }
    }
}

然后调用类:

    fetchHeartRateData(quantityTypeIdentifier: .heartRate)
    fetchHeartRateData(quantityTypeIdentifier: .heartRateVariabilitySDNN)

问题仍然是 HRV 值读取一次,并且不会随时间变化。有什么想法吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2019-03-28
    相关资源
    最近更新 更多