【发布时间】:2021-03-11 22:00:44
【问题描述】:
我已将 iCloud 添加到我的 SwiftUI 应用程序中,一切似乎都运行良好,但是我需要为它实现一个开关切换。搜索后,我发现一些论坛帖子建议在关闭 icloud 时重新创建容器。代码如下:
lazy var persistentContainer: NSPersistentContainer = {
return setupContainer()
}()
/* This is called when the iCloud setting is turned on and off */
func refreshCoreDataContainer() {
/* Save changes before reloading */
try? self.persistentContainer.viewContext.save()
/* Reload the container */
self.persistentContainer = self.setupContainer()
}
private func setupContainer() -> NSPersistentContainer {
let useCloudSync = UserSettings.shared.enableiCloudSync
let container: NSPersistentContainer!
/* Use the icloud container if the user enables icloud, otherwise use the regular container */
if useCloudSync {
container = NSPersistentCloudKitContainer(name: "App")
} else {
container = NSPersistentContainer(name: "App")
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
}
container.persistentStoreDescriptions.first?.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)
/* Load the data */
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
container.viewContext.automaticallyMergesChangesFromParent = true
})
return container
}
问题是,一旦我重新加载容器,应用程序就会崩溃并出现以下错误:
Thread 1: "executeFetchRequest:error: A fetch request must have an entity."
Multiple NSEntityDescriptions claim the NSManagedObject subclass 'App.ColorCollection' so +entity is unable to disambiguate.
'ColorCollection' (0x60f000022000) from NSManagedObjectModel (0x607000067260) claims 'App.ColorCollection'.
`
我认为崩溃与 SwiftUI 保持对旧容器的引用有关。创建窗口时,它使用环境将容器传递给它:
let contentView = MyContentView().environment(\.managedObjectContext, persistentContainer.viewContext)
所以我尝试关闭窗口,重新加载容器,然后在下面重新创建窗口,但应用仍然崩溃。
func refreshCoreDataContainer() {
windowController.window?.close()
/* Save changes before continuing */
try? self.persistentContainer.viewContext.save()
self.persistentContainer = self.setupContainer()
self.createAndShowMainWindow()
}
如何在 SwiftUI 中实现 iCloud 切换而不导致崩溃?
【问题讨论】:
-
这是否回答了您的问题stackoverflow.com/a/61284591/12299030?
-
很遗憾没有。那是我获取代码的地方之一,但它仍然崩溃。
标签: swift macos cocoa core-data swiftui