'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
}
}
}
Solution 1:[1]
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()
}
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | George |
