У меня проблема с демонстрацией плавания Simple HealthKit на Apple Watch, над которыми я работаю. Я интегрируюсь с HKLiveWorkoutBuilder и пытаюсь просто подсчитать количество кругов, которые пользователь плавает в крытом бассейне.
Я получаю последние данные от workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>)
. Тем не менее, workoutBuilderDidCollectEvent
для типа данных круга поступает с задержкой на 20+ секунд, что приводит к действительно неточным данным. Кто-нибудь еще сталкивался с чем-то подобным с HealthKit раньше? Код ниже:
static func sessionConfiguration(with poolLength: Measurement<UnitLength>) -> HKWorkoutConfiguration {
let config = HKWorkoutConfiguration()
config.activityType = .swimming
config.locationType = .indoor
config.swimmingLocationType = .pool
config.lapLength = HKQuantity(unit: poolLength.unit.asHKUnit, doubleValue: poolLength.value)
return config
}
func workoutBuilderDidCollectEvent(_ workoutBuilder: HKLiveWorkoutBuilder) {
guard let event = workoutBuilder.workoutEvents.last else { return }
let collectionInterval = (collectionTime: Date(), start: event.dateInterval.start, end: event.dateInterval.end)
switch event.type {
case .lap:
WKInterfaceDevice.current().play(.notification)
let style: SwimmingStrokeStyle
if let metadata = event.metadata, let styleNum = metadata[HKMetadataKeySwimmingStrokeStyle] as? NSNumber, let s = SwimmingStrokeStyle(rawValue: styleNum.intValue) {
style = s
} else {
style = .unknown
}
Collected.lap(style: style.rawValue, interval: collectionInterval).saveToDatabase()
case .segment:
Collected.segment(interval: collectionInterval).saveToDatabase()
default:
WKInterfaceDevice.current().play(.notification)
break
}
}
Для более подробной информации. Я получаю событие ниже круга:
(lldb) po workoutBuilder.workoutEvents.last
▿ Optional<HKWorkoutEvent>
- some : HKWorkoutEventTypeLap, <_NSConcreteDateInterval: 0x1569aa60> (Start Date) 2020-01-23 19:51:47 +0000 + (Duration) 22.497641 seconds = (End Date) 2020-01-23 19:52:09 +0000 {
HKSwimmingStrokeStyle = 2;
}
Полный круг после того, как он показывает завершенный круг: 2020-01-23 19:52:32 + 0000