保存后在子上下文中创建的新对象在父上下文中不存在

New object created in child context doesn't exist in parent context after saving

我在子上下文中插入了一个对象并获得了objectID,然后我保存了子上下文和父上下文。现在我想通过objectID获取对象,但是我只能通过子上下文获取,而不能通过父上下文获取,为什么?

...
NSManagedObjectContext *childContext = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] autorelease];
childContext.parentContext = self.parentContext;
[childContext performBlock:^{
    NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:childContext];

    if (![childContext save:&error]) {
        NSLog(@"%@", error);
    }

    [self.parentContext performBlockAndWait:^{
        if (![self.parentContext save:&error]) {
            NSLog(@"%@", error);
        }
    }];

    NSManagedObjectID *objID = [obj ObjectID];
    NSManagedObject *objTmp = [self.parentContext existingObjectWithID:objID error:&error];
    // Why objTmp is nil here?

    NSManagedObjectID *objIDTmp = [[[self.parentContext executeFetchRequest...] objectatindex:0] objectID];
    // objIDTmp is different from objID 
}];

新创建的NSManagedObject未提交的NSManagedObjectID会在save执行后发生变化

这就是您在保存对象后无法使用 objID 找到 NSManagedObject 的原因。

阅读Managed Object IDs and URIs

一个新的对象在保存到永久存储时会得到一个新的NSManagedObjectID。您可以在保存之前调用 obtainPermanentIDsForObjects 获取永久 ID。

[childContext obtainPermanentIDsForObjects:@[obj] error:&error];
NSManagedObjectID *objID = [obj ObjectID];