我试图从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)) ?? "")
}
答案 0 :(得分:1)
Apple Watch无法观察个别心跳事件。平均心率数量样本是您可用的心率的唯一表示。如果您想增加心率测量的频率,您的应用应该开始HKWorkoutSession
。