2014-01-19 21 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 –