保存来自子NSManagedObjectContext的对象在父级中不可用

时间:2016-08-17 20:18:59

标签: ios core-data nsmanagedobject managedobjectcontext

我在iOS中使用父/子托管对象上下文时遇到问题。我记得一个标准用例是使用临时子管理对象上下文,这样用户可以决定按保存并通过save()调用将更改传播到父级,或者通过让孩子放弃用户的更改Moc消失了。

我像这样创造孩子:

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保存通知的旧示例代码,但我读到使用父子托管对象上下文不再需要这些代码。上面的代码基于人们声称有效的最新ObjectiveC代码(但是在它周围抛出了一些快速的try / catch东西。)例如,这个链接Correct implementation of parent/child NSManagedObjectContext向我建议上面的设置应该可行。

1 个答案:

答案 0 :(得分:1)

好吧,这是一个错误!已知错误多年,但仅在StackOverflow中记录。答案就在这里 https://stackoverflow.com/a/11996957/2073793

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