没有上下文的CoreData关系设置?

时间:2014-01-19 14:10:36

标签: ios iphone core-data nsmanagedobjectcontext

我有两个NSManagedObject子类。 FlightAircraft。每个Flight都与一个Aircraft相关联。

当用户创建Flight时,我只会执行以下操作:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Flight" inManagedObjectContext:self.managedObjectContext];
        self.flight = [[Flight alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];

创建对象但不要将其插入managedObjectContext,直到用户确定要保存它为止。如果他们保存,我插入对象,如果他们取消,它被丢弃。

这是一个很好的解决方案,直到现在。当用户选择Aircraft时,我会这样做:

[self.flight setAircraft:aircraft];

但是,由于flight对象尚未插入managedObjectContext应用程序崩溃,因此出现此错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'aircraft' between objects in different contexts

这是有道理的。如果我一旦插入flight对象,就不会发生此错误。但是它会产生一个问题,如果用户取消并且不再需要这个飞行物体,该怎么办?

3 个答案:

答案 0 :(得分:1)

为什么不使用一组父子语境。继续在子环境中插入所有内容。如果用户最终选择“保存”,则首先在子上下文中调用save:selector(然后再调用父上下文)。如果用户最终选择“取消”,则在子上下文中调用rollback:selector。

http://www.cocoanetics.com/2012/07/multi-context-coredata/

答案 1 :(得分:0)

听起来最终,用户将保存这些更改或取消它们,并且在此期间不会发生其他CoreData操作。如果确实如此,当您准备保存时,请致电NSManagedObjectContext's save:然后。否则,调用其rollback以及撤消堆栈中的所有更改(即,自上次调用save:以来您已更改的所有内容,例如flight的创建)将是撤消。

答案 2 :(得分:0)

使用飞机和飞行的临时环境......划痕背景

这是推荐的AFAICS方式

如果用户点击保存,保存上下文,否则......什么都不做