嵌套的 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()
}
}
}
我有一个连接到它自己的 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()
}
}
}