2016-08-17 78 views
1

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

我创作的孩子是这样的:

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

然后我创建一个使用

let objectInChildMoc = NSEntityDescription.insertNewObjectForEntityForName(... 

我完成填充其所有必要的变量和我的闪亮的新对象后在childMoc对象几个依赖对象,我在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代码,人们声称它的工作原理(但是使用try/catch的东西迅速抛出它)。例如,这个链接Correct implementation of parent/child NSManagedObjectContext暗示了上面的设置应该工作。

+0

只是澄清 - 对象是保存在父MOC。如果我稍后进行抓取,我会找到它。因此,existingObjectWithID似乎是在父级管理对象上下文中查找对象的错误方法。 –

+0

我试着跳过整个'existingObjectWithID'调用,代码似乎一直工作,直到我们试图删除一个对象,然后它抱怨必须从错误的上下文中删除一个对象。 –

回答

0

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

人们需要在孩子情况下保存之前使用 obtainPermanentIDs(for:) 获得永久对象ID。然后,那些永久的ObjectIds可以用来从父上下文中检索对象。

相关问题