SwiftUI CoreData NSManagedObjectContext 在环境中

Mar*_*ark 6 core-data swift swiftui

我有一个问题将我的 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>
}
Run Code Online (Sandbox Code Playgroud)

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

[error] warning:  View context accessed for persistent container App with no stores loaded
Run Code Online (Sandbox Code Playgroud)

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

[SwiftUI] Context in environment is not connected to a persistent store coordinator: <NSManagedObjectContext: 0x600002348b60>
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ark 7

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

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)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个问题显然是自测试版以来 SwiftUI 的问题。有一个关于它的苹果开发论坛线程这里。您可以将此作为解决方法:

.sheet(isPresented: $isPresentingCategoryPicker) {
    CategoriesView()
        .environment(\.managedObjectContext, self.context)
}
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您提供这个解决方案。当将网络层与核心数据连接时,它对我帮助很大 (2认同)