perf(watchos-live): FC poussée en temps réel à chaque échantillon (throttle 2s -> envoi immédiat)

Le throttle fixe de 2s ajoutait jusqu'à 2s de latence sur /live vs l'app
Exercice native d'Apple (instantanée). Désormais chaque nouvel échantillon FC
est envoyé immédiatement ; throttle léger 0.5s conservé uniquement pour
calories/distance (anti-saturation BLE).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Sylvain
2026-05-31 12:05:27 +02:00
parent 51cbce86ef
commit 5a1568ef2f

View File

@@ -23,7 +23,10 @@ final class WorkoutManager: NSObject, ObservableObject {
private var builder: HKLiveWorkoutBuilder? private var builder: HKLiveWorkoutBuilder?
private var lastSentAt = Date.distantPast private var lastSentAt = Date.distantPast
private let sendInterval: TimeInterval = 2 // Throttle léger anti-saturation BLE pour les metrics à haute fréquence
// (calories/distance). La FC, elle, est poussée immédiatement à chaque
// nouvel échantillon comme l'app Exercice native d'Apple.
private let minSendInterval: TimeInterval = 0.5
private var simTask: Task<Void, Never>? private var simTask: Task<Void, Never>?
private override init() { super.init() } private override init() { super.init() }
@@ -137,7 +140,10 @@ final class WorkoutManager: NSObject, ObservableObject {
elapsedSec = elapsed elapsedSec = elapsed
let now = Date() let now = Date()
guard now.timeIntervalSince(lastSentAt) >= sendInterval else { return } // Nouvelle FC -> envoi immédiat (temps réel, comme Apple). Sinon (mise à
// jour calories/distance seule), on applique le throttle anti-saturation.
let heartRateUpdated = hr != nil
guard heartRateUpdated || now.timeIntervalSince(lastSentAt) >= minSendInterval else { return }
lastSentAt = now lastSentAt = now
ConnectivityManager.shared.sendSample([ ConnectivityManager.shared.sendSample([
"heartRate": heartRate, "heartRate": heartRate,