从 child 保存 object NSManagedObjectContext 在 parent 中不可用

Save object from child NSManagedObjectContext not available in parent

我在 iOS 中遇到 parent/child 托管 object 上下文的问题。我记得一个标准用例是使用临时 child 托管 object 上下文,以便用户可以决定按保存并通过 save() 调用将更改传播到 parent ,或者可以通过让 child Moc 消失来放弃用户的更改。

我这样创建 child:

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

然后我使用

在 childMoc 中创建一个 object
let objectInChildMoc = NSEntityDescription.insertNewObjectForEntityForName(...

在我用所有必要的变量和几个依赖的 object 填充我闪亮的新 object 之后,我在 Swift 中使用这段代码来尝试访问新的object 来自 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")
    }
})

我总是 "Couldn't find object in parent"。我错过了什么?我看到使用 NSManagedObjectContext 保存通知的旧示例代码,但我读到那些对于 parent-child 托管 Object 上下文不再是必需的。上面的代码是基于人们声称有效的最近的 ObjectiveC 代码(但是周围有 swift 的 try/catch 东西。)例如,这个 link Correct implementation of parent/child NSManagedObjectContext 向我建议上述设置应该有效。

好的,这是一个错误!多年来已知的错误,但仅记录在 Whosebug 中。答案在这里

需要使用以下方法获取永久对象 ID obtainPermanentIDs(for:) before 在子上下文中保存。然后,这些永久性 ObjectId 可用于从父上下文中检索对象。