import Combine import Foundation import GRDB @MainActor final class RostersStore: ObservableObject { @Published private(set) var rosters: [Roster] = [] private var cancellable: AnyCancellable? init(clientsPublisher: Published<[Client]>.Publisher) { subscribeToClientsStore(clientsPublisher: clientsPublisher) } private func subscribeToClientsStore(clientsPublisher: Published<[Client]>.Publisher) { let rostersPublisher = ValueObservation.tracking(Roster.fetchAll) .publisher(in: Database.shared.dbQueue) .receive(on: DispatchQueue.main) .catch { _ in Just([]) } cancellable = clientsPublisher .flatMap { clients in Publishers.MergeMany(clients.map { $0.$state }) .prepend(clients.map { $0.state }) .collect() } .combineLatest(rostersPublisher) .sink { [weak self] clientStates, rosters in self?.handleUpdates(clientStates: clientStates, rosters: rosters) } } private func handleUpdates(clientStates: [ClientState], rosters: [Roster]) { self.rosters = rosters print("Client States: \(clientStates.count), Rosters: \(rosters.count)") } }