2014-01-19 16 views
2

我有两个NSManagedObject的子类。 FlightAircraft。每个Flight与一个Aircraft相关联。没有上下文的CoreData关系设置?

当用户创建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对象,就不会发生此错误。但是这样会产生一个问题,即如果用户取消并且不再需要这个飞行物体呢?

回答

1
划伤方面

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

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

0

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

+0

我同意OP和苹果确实太AFAICS - >他们推荐了一个从无到有方面 –

+0

我不会把未完成的数据到任何“全球背景下” –

0

使用的飞机临时的上下文和飞行..这是推荐的方式AFAICS

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

+0

我的印象是,无论是'Flight'和“飞机”对象需要成为同一环境的一部分。然而,我看不出临时的工作方式,因为飞机已经被保存在主要环境中。 –

+0

然后只是重新提取:)你是正确的,他们需要在同一个ctx –