gpt4 book ai didi

swift - 父 NSManagedObjectContext 必须使用 NSPrivateQueueConcurrencyType 或 NSMainQueueConcurrencyType

转载 作者:行者123 更新时间:2023-11-30 10:33:25 25 4
gpt4 key购买 nike

在 macOS 应用程序上,我有一个简单的 AddEditViewController,它从主视图 Controller 接收 NSManagedObject。然后,我创建一个子 NSManagedObjectContext,以便在用户按下取消按钮时轻松恢复更改。

这是ViewWillAppear()的实现

    super.viewWillAppear()
// Create child MOC
self.managedObjectContext = NSManagedObjectContext(concurrencyType: self.parentManagedObjectContext.concurrencyType)
self.managedObjectContext.parent = self.parentManagedObjectContext

但这给了我以下错误:

[General] Parent NSManagedObjectContext must use either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType.
0 CoreFoundation 0x00007fff379aad63 __exceptionPreprocess + 250
1 libobjc.A.dylib 0x00007fff6d899bd4 objc_exception_throw + 48
2 CoreData 0x00007fff3743676e -[NSManagedObjectContext setParentContext:] + 334
3 Zacc 0x00000001000714fa $s4MyApp28AddEditViewControllerC14viewWillAppearyyF + 666

对这里的问题有什么想法吗?我在网上找不到任何东西。

我在 macOS 10.15 上使用 Xcode 11。

感谢您的帮助!

最佳答案

事实证明,问题在于默认情况下,父 MOC 是在 NSPersistentDocument 中使用已弃用的 init() 创建的。此 MOC 接收 concurrencyType:.confinementConcurrencyType,该类型也已弃用。这就是我收到错误的原因。

我通过修改 NSPersistentDocument 中的主要 ManagedObjectContext 修复了此问题:

class Document: NSPersistentDocument {

override init() {
super.init()
// Add your subclass-specific initialization here.
// Replace moc created with init() (deprecated) with a good one
let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
moc.mergePolicy = self.managedObjectContext!.mergePolicy
moc.persistentStoreCoordinator = self.managedObjectContext!.persistentStoreCoordinator
self.managedObjectContext = moc
}
}

现在我可以基于这个好的父 MOC 轻松创建子 MOC。

关于swift - 父 NSManagedObjectContext 必须使用 NSPrivateQueueConcurrencyType 或 NSMainQueueConcurrencyType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58610341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com