嵌套的 ObservableObject 未在 SwiftUI 视图中更新

Nested ObservableObject isn't updated in SwiftUI View

我有一个连接到它自己的 ObservableObject 视图模型的视图,该视图模型引用嵌套的 websocket ObservableObject。但是,无论何时收到新的 websocket 消息,更新的数据都不会传递到视图。为什么它不起作用,我该如何解决?

查看

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)
        }
    }
}

查看模型

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

    ...
}

Websocket 视图模型

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

    ...

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

您需要观察 websocketViewModel 实例在 MainViewModel 中何时发生变化。

您可以通过在实例更改时触发 objectWillChange.send() 来执行此操作:

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

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