swiftui - SwiftUI View 中的 onReceive 导致无限循环

标签 swiftui

在 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/

相关文章:

swift:如何调用 Observableobject 中的函数

SwiftUI LazyHGrid 行居中

swift - map View 在交互上显示白色叠加

swiftui - NavigationBarTitle 导致 TabView 内出现错误

swift - 是否可以编写一个函数来组成任意数量的 SwiftUI `ViewModifier' s?

ios - SwiftUI - 错误 - 类型的值没有成员

swiftui - 如何将环境对象变量绑定(bind)到 slider

macos - SwiftUI:响应 macOS 上的应用程序终止

swift - 解决包依赖 swiftUI 项目时出错

swiftui - SwiftUI 的间距问题