AnyBio
Guides

Live Data Store

BioLiveStore

BioLiveStore is an ObservableObject that accumulates real-time biosignal data, device states, and session info into @Published properties. It's designed to drive SwiftUI views directly.

Usage

Create a store and feed it events from the SDK:

import BioSDK
import Combine

let store = BioLiveStore()
var cancellables = Set<AnyCancellable>()

sdk.events
    .sink { event in
        switch event {
        case .sample(let deviceId, let sample):
            store.ingest(sample, deviceId: deviceId)
        case .deviceState(let device, let connection, let stream):
            store.updateDeviceState(
                deviceId: device.id.uuidString,
                connection: connection,
                stream: stream
            )
        case .session(.started(let id, let devices)):
            store.updateSession(id: id, devices: devices)
        default:
            break
        }
    }
    .store(in: &cancellables)

Published Properties

Signal Data

// All signals by name (e.g., "ecg", "ppg", "hr")
@Published var signals: [String: [BioSample]]

// Signals organized by device
@Published var signalsByDevice: [String: [String: [BioSample]]]

// List of signal types currently being received
var availableSignals: [String]

Device State

// Device display names
@Published var deviceNames: [String: String]

// Per-device connection states
@Published var deviceConnectionStates: [String: BioConnectionState]

// Per-device streaming states
@Published var deviceStreamStates: [String: BioStreamState]

// Auto-stream enabled per device
@Published var deviceAutoStream: [String: Bool]

// Battery level per device (0-100)
@Published var deviceBattery: [String: Int]

Session State

// Active session ID
@Published var currentSessionId: String?

// Conflicting session ID (from 409 conflict)
@Published var conflictingSessionId: String?

// Session error message
@Published var sessionError: String?

SwiftUI Integration

Since BioLiveStore is an ObservableObject, inject it into your SwiftUI views:

struct DashboardView: View {
    @ObservedObject var store: BioLiveStore

    var body: some View {
        VStack {
            if let ecgSamples = store.signals["ecg"] {
                BioECGChart(samples: ecgSamples)
            }

            ForEach(Array(store.deviceConnectionStates.keys), id: \.self) { deviceId in
                let name = store.deviceNames[deviceId] ?? "Unknown"
                let state = store.deviceConnectionStates[deviceId] ?? .discovered
                Text("\(name): \(state)")
            }
        }
    }
}

Memory Management

The store manages memory automatically during background/foreground transitions:

store.enterBackgroundMode()  // Reduces memory footprint
store.enterForegroundMode()  // Restores full buffering

store.reset()  // Clear all accumulated data

Accessing Samples

// All samples for a signal type
let ecg = store.samples(for: "ecg")

// Samples from a specific device
let deviceEcg = store.samples(for: "ecg", deviceId: "DEVICE-UUID")

On this page