Родительский NSManagedObjectContext должен использовать либо NSPrivateQueueConcurrencyType, либо NSMainQueueConcurrencyType - PullRequest
0 голосов
/ 29 октября 2019

в приложении 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

Есть идеи здесь? Я не смог ничего найти в сети.

Я использую Xcode 11 на macOS 10.15.

Спасибо за помощь!

1 Ответ

0 голосов
/ 29 октября 2019

Оказывается, проблема в том, что родительский MOC создается по умолчанию в NSPersistentDocument с устаревшим init(). Этот MOC получает как concurrencyType: .confinementConcurrencyType, что также не рекомендуется. Вот почему я получаю ошибку.

Я исправил это, изменив основной ManagedObjectContext в NSPersistentDocument:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...