在 SwiftUI 应用程序中,我有一个 ObservableObject
跟踪用户设置:
class UserSettings: ObservableObject {
@Published var setting: String?
}
我有一个 View 模型来控制 View 的状态:
class TestViewModel: ObservableObject {
@Published var state: String = ""
}
我有我的看法。当用户设置发生变化时,我想让 View 模型更新 View 的状态:
struct HomeView: View {
@EnvironmentObject var userSettings: UserSettings
@ObservedObject var viewModel = TestViewModel()
var body: some View {
Text(viewModel.state)
.onReceive(userSettings.$setting) { setting in
self.viewModel.state = setting
}
}
}
当
UserSettings.setting
在另一个 View 中更改它会导致 onReceive
我认为在无限循环中被调用,我不明白为什么。我看到了 this question ,这个循环对我来说很有意义,因为 ObservableObject
的状态被观察正在被观察改变。但是,就我而言,我不会更改观察对象(环境对象)状态。我正在观察环境对象并更改重绘 View 的 View 模型状态。
View 是否重新绘制了导致问题的原因?是否
onReceive
每次重绘 View 时都会被调用?有没有更好的方法来完成我想要做的事情?
编辑 : 这是我的问题的一个大大简化的版本。在我的应用程序中, View 模型负责根据用户的设置执行网络请求并更新 View 状态,例如显示错误消息或加载指示器。
最佳答案
从描述的场景中,我没有看到在 View 模型中复制设置的原因。您可以直接从 userSettings
显示值,如
struct HomeView: View {
@EnvironmentObject var userSettings: UserSettings
@ObservedObject var viewModel = TestViewModel()
var body: some View {
Text(userSettings.setting)
}
}
关于swiftui - SwiftUI View 中的 onReceive 导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61668356/