父 NSManagedObjectContext 必须使用 NSPrivateQueueConcurrencyType 或 NSMainQueueConcurrencyType
Parent NSManagedObjectContext must use either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType
在 macOS 应用程序上,我有一个简单的 AddEditViewController
从主视图控制器接收 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。
在 macOS 应用程序上,我有一个简单的 AddEditViewController
从主视图控制器接收 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。