Simon Rex
Simon Rex

Reputation: 183

Nested ObservableObject isn't updated in SwiftUI View

I have a view that is connected to its own ObservableObject view model which references a nested websocket ObservableObject. However, whenever a new websocket message is received, the updated data isn't passed onto the view. Why doesn't it work and how can I fix it?

View

struct MainView: View {
    @StateObject var viewModel = MainViewModel()
    
    var body: some View {
        ZStack {
            ...
        }
        .onChange(of: viewModel.websocketViewModel.messageRcvd) { message in
            // this doesn't get triggered
            viewModel.messageRcvd(message)
        }
    }
}

View Model

class MainViewModel: ObservableObject {
    @ObservedObject var websocketViewModel = WebsocketViewModel()

    ...
}

Websocket view model

class WebsocketViewModel: ObservableObject {
    @Published var messageRcvd: JSON?

    ...

    // this function gets triggered on new websocket messsage
    private func webSocketListener() {
        ...
        DispatchQueue.main.async {
            messageRcvd = json
        }
    }
}

Upvotes: 0

Views: 191

Answers (1)

George
George

Reputation: 30461

You need to observe when the websocketViewModel instance changes in MainViewModel.

You can do this by triggering objectWillChange.send() when the instance changes:

class MainViewModel: ObservableObject {
    let websocketViewModel = WebsocketViewModel()
    private var cancellable: AnyCancellable?

    init() {
        cancellable = websocketViewModel.objectWillChange.sink { [unowned self] _ in
            objectWillChange.send()
        }
    }
}

Upvotes: 1

Related Questions