【问题标题】:Is it possible to reinject the environment value (managedObjectContext) during runtime是否可以在运行时重新注入环境值(managedObjectContext)
【发布时间】:2022-01-10 18:58:20
【问题描述】:

我通过以下方式将NSManagedObjectContext 注入到我的视图层次结构中。

@main
struct MyApp: App {
  var persistence: Persistence

  var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistence.container.viewContext)
        }
    }
}

在用户设置中,我可以打开/关闭 CloudKit 同步机制。 Persistence 实例中的 viewContext 将相应地重新初始化。这工作正常。但我的完整视图层次结构仍在使用旧的NSManagedObjectContext 实例。

有什么方法可以更新(重新注入)环境值或使用新实例化的viewContext 重新加载整个视图层次结构?

【问题讨论】:

  • 不知道这是否可行,但如果你让Persistence 成为一个带有'static let shared = Persistence()' 的单例,而不是在环境中传递它,将其称为在你的视图中有一个@ObservedObject?

标签: core-data swiftui cloudkit


【解决方案1】:

这是一种可能的方法-您需要将Persistence设置为ObservableObject并在应用程序中观察它,例如

struct MyApp: App {
  @StateObject var persistence: Persistence = Persistence() // or whatever init neede

  ...

class Persistence: ObservableObject {
  @Published var container: NSPersistentContainer?

  ...

因此,每当您更改容器时,视图上下文都会重新注入ContentView

【讨论】:

  • 我将您的提案集成到我的应用程序中。不幸的是,这只是故事的一半。持久性更改通过视图层次结构传播。但是.environment(\.managedObjectContext, persistence.container.viewContext) 仍然没有更新。我在应用程序中额外添加了.id(persistence.persistenceContainerReloaded) 以触发视图层次结构的完全重新加载。
猜你喜欢
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2014-12-23
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多