2012-08-08 35 views
6

childContext和parentContext是 “NSMainQueueConcurrencyType” 两个嵌套的NSManagedObjectContext保存的objectID

[childContext performBlock:^(void) { 
    [childContext save:NULL]; 

    [parentContext performBlock:^(void) { 
    [parentContext save:NULL]; 
    // Why is objectID for the inserted NSManagedObject still a temporary one here? 
    }]; 
}]; 

问:

  1. 这是救两个孩子和家长方面
  2. 为什么才是正道它保存后,插入NSManagedObject的objectID仍然是一个临时的?

回答

3

我可以想到在少数情况下,您希望将主队列MOC作为另一个主队列MOC的子项,但看到这肯定让我想问:两者的优点是:他们是NSMainQueueConcurrencyType?

此外,这是一个已知的错误(至少已经报道了很多次)。当您从子上下文中插入并保存时,只有直接连接到持久存储的那个ID才会发生突变。所以,在保存新插入的项目时,您有几个选择。

  1. 保存前获取持久性ID。
  2. 致电[moc refreshObject:object mergeChanges:NO]并将所有引用设置为nil。最父后
  3. 采集永久标识可以节省

我喜欢#3,因为它需要蘸到数据库中。如果你之后这样做,它可以从父母那里获得。

+1

要回答您的答案中的问题:创建一个孩子MOC作为一个“暂存区”进行一系列更改,允许它们以原子方式保存或拒绝。 (换句话说,如果用户点击取消按钮,您只需丢弃MOC而不保存它。) – benzado 2012-09-26 21:03:33