迅速获得瞬时心跳数据

时间:2017-06-26 23:27:58

标签: swift apple-watch health-kit

我试图从Apple Watch获得每个心跳的实例。目前,我能够以每分钟的心跳速度获得心率,但无法获得每次心跳的时间。它似乎以随机的时间间隔发送心率数据,因此无法使用每个样本的时间来获得心跳时间。

单位是什么并不重要,只要我能够在收到新节拍时更新它,而不是像现在这样进行每次节拍。或者,如果我能得到它给我每次节拍的时间而不是每次节拍。有什么方法可以在心跳加入时强制更新updateHandler吗?我认为这是使用HKAnchoredObjectQuery的重点。

func startRecordingHeartRate() {
    let heartRateSample = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)
    let heartRateUnit = HKUnit.count().unitDivided(by: HKUnit.minute())
    let datePredicate = HKQuery.predicateForSamples(withStart: Date(), end: nil,
                                                    options: .strictStartDate)
    let anchor: HKQueryAnchor? = nil
    let updateHandler: (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> () = {
        query, newResult, deleted, newAnchor, error in

        if let samples = newResult as? [HKQuantitySample] {
            guard samples.count > 0 else {
                return
            }

            for sample in samples {
                let doubleSample = sample.quantity.doubleValue(for: heartRateUnit)
                let timeSinceStart = sample.endDate.timeIntervalSince(self.startTime)
                self.hkHeartRate[0].append(doubleSample)
                self.hkHeartRate[1].append(Double(timeSinceStart))
            }

            self.updateHeartRateLabel()
            self.processData.heartRateArray = self.hkHeartRate
            self.processData.checkData()
        }
    }

    let heartRateQuery = HKAnchoredObjectQuery(type: heartRateSample!,
                                               predicate: datePredicate,
                                               anchor: anchor,
                                               limit: Int(HKObjectQueryNoLimit),
                                               resultsHandler: updateHandler)

    heartRateQuery.updateHandler = updateHandler
    healthStore.execute(heartRateQuery)
}

func updateHeartRateLabel() {
    let endIndex = self.hkHeartRate[0].endIndex
    let lastHeartRate = self.hkHeartRate[0][endIndex-1]
    self.heartRateLabel.setText(self.numberFormatter.string(from:NSNumber(value: lastHeartRate)) ?? "")
}

1 个答案:

答案 0 :(得分:1)

Apple Watch无法观察个别心跳事件。平均心率数量样本是您可用的心率的唯一表示。如果您想增加心率测量的频率,您的应用应该开始HKWorkoutSession