如何从子上下文检索对象到另一个上下文?

时间:2019-03-26 07:02:15

标签: swift core-data parent-child

我无法使用objectID访问新保存的对象。

我从我的managedContext中创建了一个子托管对象上下文(cmoc),并在此cmoc中创建了一个新对象。将变量输入新对象后,我在子上下文中调用了save(),在父上下文中进行了保存,然后尝试在父上下文中加载该对象(并尝试在另一个背景上下文中)使用objectID。这失败了,我不知道为什么。

我已确保在尝试在新上下文中返回对象之前进行保存,但这样做没有帮助。我确保保存了正确的cmoc和父上下文。我有点茫然。

要创建childContext,人员(人员类型)的对象实例并传递到下一个vc(destVC):

let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
childContext.parent = coreDataStack.managedContext
let person = Person(context: childContext)
destVC.coreDataStack = coreDataStack
destVC.person = person
destVC.childContext = childContext

然后将变量添加到人员实例

person.cellPhone = ... [etc]

我怀疑我的问题出在保存代码中,该代码当前指出:

guard childContext.hasChanges else {
    return
}
do {
    try self.newKeyNumberContext.save()
} catch let error as NSError {
    [Manage error]
}
coreDataStack.saveContext()

或者在随后的代码中:

let personObjectID = self.person.objectID    //(does return an objectID)

let personToReturn = try? coreDataStack.managedContext.existingObject(with: personObjectID)

不返回对象,而是返回nil。

1 个答案:

答案 0 :(得分:0)

嗯,原来来自stackOverflow的this link导致我找到了解决方案。我只有一个临时ID,在保存之前要求输入一个永久ID解决了该问题。我将以下行插入到警卫childContext.hasChanges行上方,并对其进行了排序。

try? childContext.obtainPermanentIDs(for: [person])