编辑以前保存的实体时使用两个ManagedObjectContexts

时间:2013-10-06 05:22:06

标签: ios core-data

我正在使用两个上下文,这样如果用户创建我的NSManagedObjectModel子类,AddressAnnotation(在地图上指向),当用户创建一个新路由(我的另一个实体与AddressAnnotation有多对多的关系)时,如果他们决定取消,我可以轻易地丢弃对象,因为它们是在tempContext中创建的。所以代码看起来像这样:

        AddressAnnotation *anAddress = [AddressAnnotation insertAddressAnnotationWithCoordinate:coordinate inManagedObjectContext:self.tempContext];
        [self.route addAddressAnnotationsObject:anAddress];

然后当我保存地址和路线时,我这样做:

 NSManagedObjectContext *tempContext = [self.route managedObjectContext];

    [tempContext performBlock:^{
        NSError *error = nil;
        if (![tempContext save:&error]) {
            NSLog(@"an error occurred: %@", [error localizedDescription]);
        }

        [self.managedObjectContext performBlock:^{
            NSError *error = nil;
            if (![_managedObjectContext save:&error]) {
                NSLog(@"error in main context: %@", [error localizedDescription]);
            }
        }];
    }];

这部分工作正常。我现在遇到的问题是,在我显示这些保存路由的另一个视图控制器中,路由来自self.managedObjectContext,我的主要上下文。因此,在我显示保存的路线后,如果他们选择了它,那么它会返回到地图,以便他们可以添加更多。我在故事板上这样做:

    if ([destination respondsToSelector:@selector(setManagedObjectContext:)]) {
        [destination setValue:_managedObjectContext forKey:@"managedObjectContext"];
    }

但是现在,当我尝试调用[self.route addAddressAnnotationsObject:anAddress];因为self.tempContext与路由的上下文不同时,我无法添加它。我也不能只说主要背景现在是临时文本。关于我应该怎么做的任何想法?提前谢谢。

1 个答案:

答案 0 :(得分:0)

self.route位于self.managedObjectContext,但anAddress位于self.tempContext。要解决此问题,您必须获取objectID self.route,然后使用它在self.tempContext中找到该对象:

- (NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)error