【问题标题】:Working with multiple onReceive with @EnvironmentObject in SwiftUI在 SwiftUI 中使用 @EnvironmentObject 处理多个 onReceive
【发布时间】:2022-01-22 00:48:24
【问题描述】:

我在 SwiftUI 中使用 @EnvironmentObject 时遇到了一个问题。我在一个单独的文件中创建了一个 ObservableObject update。现在,我将其称为来自 2 个不同视图(视图 1 和视图 2)的 @EnvironmentObject。当 update 值更改时,我必须在 View1 和 View2 中执行某些任务。所以我在 View1 和 View2 中都使用了 .onReceive() 。 现在,当 update 值发生变化时,我希望 View1 中的 .onReceive 函数应该在 View2 中的 .onReceive 函数之前调用。那么有人可以建议我该怎么做吗?

【问题讨论】:

  • 在没有任何代码或不了解您的应用程序的情况下很难说出您在做什么,但据我所知,onReceive 将大部分同时完成。如果onReceive 确实适合您的应用程序,那么您可以尝试延迟您在第二个onReceive 中所做的事情,例如将内容包装在DispatchQueue.main.asyncAfter(deadline: .now() + 1) {...} 中。
  • @workingdog 简单地添加 DispatchQueue.main.async 对我有用。谢谢!

标签: swift swiftui


【解决方案1】:

我们不会将onReceiveObservableObject 一起使用。我们要么在 @StateObject 属性包装器中初始化对象,要么在 @ObservedObject 中初始化对象,如果它在其他地方初始化。这些属性包装器意味着每当@Published 变量发生任何变化时都会自动调用视图的主体,这会调用objectWillChange.send(),您也可以手动执行此操作。如果您想通过更改对象的 var 来产生副作用,您可以在 body 内的视图上使用 onChange(of:perform:)。由于每次对象更改时都会调用主体,因此也会调用onChange,如果传入的值与上次不同,则块运行。

例如

struct ContentView: View {
    @StateObject var progress = UserProgress()

    var body: some View {
        VStack {
            Text("Your score is \(progress.score)")
            ...
        }
        .onChange(of: player.score) { [oldScore = player.score] newScore in
            print("changed from \(oldScore) to \(newScore)")
        }
    }
}

了解 oldScore/newScore in this question 的捕获列表的使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多