Сохранить объект из дочернего NSManagedObjectContext недоступно в родительском

У меня проблемы с контекстом родительского / дочернего объекта в iOS. Напомню, что стандартный сценарий использования - это использование временного контекста управляемого дочернего объекта, чтобы пользователь мог принять решение сохранить нажатие и передать изменения до родителя с помощью вызовов save(), или изменения пользователя можно отменить, разрешив дочернему элементу Мок исчезнет.

Я создаю ребенка так:

childMoc = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
childMoc.parentContext = parentMoc

И тогда я создаю объект в childMoc, используя

let objectInChildMoc = NSEntityDescription.insertNewObjectForEntityForName(...

После того, как я закончу заполнять свой блестящий новый объект всеми необходимыми переменными и парой зависимых объектов, я использую этот код в Swift, чтобы попытаться получить доступ к новому объекту из контекста Parent:

childMoc.performBlock({
    do {
        try childMoc.save()     
        parentMoc.performBlock({
            do {
                try parentMoc.save()                
                do {
                    let objectInParentMoc = try parentMoc.existingObjectWithID(objectInChildMoc.objectID) as? TheRightType                  
                } catch {
                    print("Couldn't find object in parent")
                }       
            } catch {
                print("Couldn't save parent")
            }
        })  
    }
    catch {
        print ("Couldn't save child")
    }
})

Я всегда получаю "Не удалось найти объект в родительском". Что мне не хватает? Я вижу старый пример кода, в котором используются уведомления о сохранении NSManagedObjectContext, но я прочитал, что они больше не нужны в контексте управляемых объектов parent-child. Приведенный выше код основан на недавнем коде ObjectiveC, который, как утверждают люди, работает (но с использованием метода try/catch из swift.) Например, эта ссылка Правильная реализация parent/child NSManagedObjectContext предлагает мне, чтобы вышеуказанная установка работала.

1 ответ

Решение

Хорошо, это ошибка! Известная ошибка на протяжении многих лет, но задокументированная только в Stackru. Ответ здесь /questions/420067/bazovyie-dannyie-poluchayut-li-kogda-libo-dochernie-kontekstyi-postoyannyie-objectid-dlya-vnov-vstavlennyih-obektov/420084#420084

Нужно получить постоянные идентификаторы объектов, используя obtainPermanentIDs(for:)перед сохранением в дочернем контексте. Затем эти постоянные ObjectIds можно использовать для извлечения объектов из родительского контекста.

Другие вопросы по тегам