Swift 父NSManagedObjectContext必须使用NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType

Swift 父NSManagedObjectContext必须使用NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType,swift,cocoa,core-data,Swift,Cocoa,Core Data,在macOS应用程序上,我有一个简单的AddEditViewController,它从主视图控制器接收NSManagedObject。 然后,我创建一个子NSManagedObjectContext,以便在用户按下取消按钮时轻松恢复更改 下面是viewwillappease() 但这给了我以下错误: [General] Parent NSManagedObjectContext must use either NSPrivateQueueConcurrencyType or NSMainQueu

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

下面是
viewwillappease()

但这给了我以下错误:

[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:
的形式接收。限制concurrencyType
,该类型也已弃用。 这就是我出错的原因

我通过修改
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

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
    }
}