6

childContext 和 parentContext 都是“NSMainQueueConcurrencyType”

[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还是临时的?
4

1 回答 1

3

我可以想到一些罕见的情况,您希望将主队列 MOC 作为另一个主队列 MOC 的子队列,但看到这一点肯定会问我:让它们都成为 NSMainQueueConcurrencyType 有什么好处?

此外,这是一个已知的错误(至少它已被多次报告)。当您从子上下文插入和保存时,只有直接连接到持久存储的那个才会改变其 ID。因此,在保存新插入的项目时,您有多种选择。

  1. 保存前获取永久 ID。
  2. 调用[moc refreshObject:object mergeChanges:NO]并将所有引用设置为 nil。
  3. 在大多数父级保存后获取永久 ID

我更喜欢#3,因为它需要深入了解数据库。如果你之后这样做,它可以从父母那里得到它们。

于 2012-08-09T03:59:02.120 回答