如何将子上下文中的对象检索到另一个上下文中?

Posted

技术标签:

【中文标题】如何将子上下文中的对象检索到另一个上下文中?【英文标题】:How to retrieve an object from a child context into another context? 【发布时间】:2019-03-26 07:02:14 【问题描述】:

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

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

我已确保在尝试在新上下文中返回对象之前进行了保存,但这并没有帮助。我已经确定我保存了正确的 cmoc 和父上下文。我有点不知所措。

要创建 childContext、person 的对象实例(Person 类型)并传递给下一个 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 实例中

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。

【问题讨论】:

您的目标最低 ios 版本是多少? 部署目标 11.1 【参考方案1】:

啊,原来*** 中的this link 引导我找到了解决方案。在保存解决问题之前,我只有一个临时 ID 并要求提供一个永久 ID。我在保护 childContext.hasChanges 行上方插入以下行并将其整理出来。

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

【讨论】:

以上是关于如何将子上下文中的对象检索到另一个上下文中?的主要内容,如果未能解决你的问题,请参考以下文章

如何从视图中的上下文对象中检索对象或特定字段?

如何从 AWS API Gateway 自定义授权方检索 Spring Boot 中的上下文对象?

将子对象添加到表中 当父对象保存到上下文中时

QT 模型/视图编程:我应该如何检索上下文菜单选项的额外数据?

无法在具有现有ObjectWithID 的子上下文中检索临时对象:错误:

通过反应上下文 api 将子状态传递给父组件