3

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

我这样创建孩子:

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

然后我使用在 childMoc 中创建一个对象

let objectInChildMoc = NSEntityDescription.insertNewObjectForEntityForName(...

在我用所有必要的变量和几个依赖对象填充我闪亮的新对象后,我在 Swift 中使用此代码尝试从父上下文访问新对象:

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 代码(但是它周围抛出了 swift 的 try/catch 东西。)例如,这个链接Correct implementation of parent/child NSManagedObjectContext向我建议上面的设置应该工作。

4

1 回答 1

2

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

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

于 2016-08-18T02:46:37.930 回答