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 中工作吗?
找出导致这两条错误消息的原因。第一个错误来自我的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)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个问题显然是自测试版以来 SwiftUI 的问题。有一个关于它的苹果开发论坛线程这里。您可以将此作为解决方法:
.sheet(isPresented: $isPresentingCategoryPicker) {
CategoriesView()
.environment(\.managedObjectContext, self.context)
}
Run Code Online (Sandbox Code Playgroud)
似乎环境被模态呈现的视图控制器清除了。
| 归档时间: |
|
| 查看次数: |
1918 次 |
| 最近记录: |