Сохранить объект из дочернего 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 можно использовать для извлечения объектов из родительского контекста.