【问题标题】:SwiftUI CoreData NSManagedObjectContext in the EnvironmentSwiftUI CoreData NSManagedObjectContext 在环境中
【发布时间】:2020-05-05 09:25:54
【问题描述】:

我在将 NSManagedObjectContext 暴露给 SwiftUI 的环境时遇到问题。这是我的代码:

extension SceneDelegate: UIWindowSceneDelegate {

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = scene as? UIWindowScene else { return }

        let window = UIWindow(windowScene: windowScene)
        let context = PersistentContainer.shared.viewContext

        let rootView = TabBarView().environment(\.managedObjectContext, context)
        window.rootViewController = UIHostingController(rootView: rootView)

        self.window = window
        window.makeKeyAndVisible()
    }
}

class PersistentContainer: NSPersistentContainer {
    static let shared = PersistentContainer()

    private convenience init() {
        self.init(name: "App")

        viewContext.mergePolicy = NSMergePolicy(merge: .mergeByPropertyStoreTrumpMergePolicyType)
        viewContext.automaticallyMergesChangesFromParent = true

        loadPersistentStores { description, error in
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
    }
}

struct CategoriesView: View {
    @Environment(\.managedObjectContext) var context

    @FetchRequest(entity: CoreCategory.entity(),
                  sortDescriptors: [
                    NSSortDescriptor(keyPath: \CoreCategory.createdAt, ascending: true)
                  ]
                 ) var categories: FetchedResults<CoreCategory>
}

我的CategoriesView 是我的根视图,因此在应用启动时会访问上下文。我的应用启动时出现以下错误...

[error] warning:  View context accessed for persistent container App with no stores loaded

...但视图能够很好地显示结果。此外,如果我以与我的 CategoriesView 相同的格式呈现包含 SwiftUI @FetchRequest 的模态视图,应用程序将崩溃并出现以下错误:

[SwiftUI] Context in environment is not connected to a persistent store coordinator: <NSManagedObjectContext: 0x600002348b60>

从我在网上找到的所有教程中,我以推荐的方式公开我的NSManagedObjectContext。我有一种感觉,这与 loadPersistentStores 是异步的有关,但上下文是在 Environment 中同步设置的。还有其他人能够让 CoreData 在 SwiftUI 中工作吗?

【问题讨论】:

    标签: swift core-data swiftui


    【解决方案1】:

    找出导致这两条错误消息的原因。第一个错误来自我的PersistentContainer 单例。我将配置viewContext 的两行移到loadPersistentStores 完成块中,这些警告消失了:

    private convenience init() {
        self.init(name: "App")
    
        loadPersistentStores { description, error in
            viewContext.mergePolicy = NSMergePolicy(merge: .mergeByPropertyStoreTrumpMergePolicyType)
            viewContext.automaticallyMergesChangesFromParent = true
    
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
    }
    

    第二个问题显然是 SwiftUI 自测试版以来的问题。 Apple Dev Forums here 上有一个关于它的帖子。您可以这样做作为一种解决方法:

    .sheet(isPresented: $isPresentingCategoryPicker) {
        CategoriesView()
            .environment(\.managedObjectContext, self.context)
    }
    

    似乎为模态呈现的视图控制器清除了环境。

    【讨论】:

    • 感谢您提供此解决方案。在使用 Core Data 加入网络层时,它帮助了我很多
    • .sheet(isPresented: $isPresentingCategoryPicker) { CategoriesView() .environment(\.managedObjectContext, self.context) } 成功了!
    【解决方案2】:

    关于第二个问题,我看到一个教程解释说,当你以模态方式呈现视图时,它实际上是在添加一个子视图,所以上下文应该是 self.context。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多