我有两个NSManagedObject
子类。 Flight
和Aircraft
。每个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
对象,就不会发生此错误。但是它会产生一个问题,如果用户取消并且不再需要这个飞行物体,该怎么办?
答案 0 :(得分:1)
为什么不使用一组父子语境。继续在子环境中插入所有内容。如果用户最终选择“保存”,则首先在子上下文中调用save:selector(然后再调用父上下文)。如果用户最终选择“取消”,则在子上下文中调用rollback:selector。
答案 1 :(得分:0)
听起来最终,用户将保存这些更改或取消它们,并且在此期间不会发生其他CoreData操作。如果确实如此,当您准备保存时,请致电NSManagedObjectContext's
save:
然后。否则,调用其rollback
以及撤消堆栈中的所有更改(即,自上次调用save:
以来您已更改的所有内容,例如flight
的创建)将是撤消。
答案 2 :(得分:0)
使用飞机和飞行的临时环境......划痕背景
这是推荐的AFAICS方式
如果用户点击保存,保存上下文,否则......什么都不做