2011-08-14 21 views
0

Lionの新機能、子管理オブジェクトのコンテキスト: "インスペクタウィンドウやビューなどの破棄可能な編集の管理"を使用しています。一時管理対象オブジェクトIDと子管理オブジェクトコンテキスト

親MOCから子MOCに管理オブジェクトIDを渡すと、親MOCが一度も保存されていないとエラーが表示されます。「ストアに見つからないオブジェクトにアクセスしようとしています。

NSManagedObjectContext *parentContext = [(NSPersistentDocument *)[[[self window] windowController] document] managedObjectContext]; 

self.subMOC = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease]; 

[subMOC setParentContext:parentContext]; 

NSManagedObjectID *objectValueID = [[[self superview] valueForKey:@"objectValue"] objectID]; 

self.subObjectValue = [subMOC existingObjectWithID:objectValueID error:&err]; 

文書が保存されている場合は、上記の操作は適切です。保存されていない場合、私の選択肢は何ですか?

答えて

2

MOCが保存される前に、すべてのオブジェクトIDが一時的なものであるため、コンテキストを保存して「実際の」オブジェクトIDを取得する必要があります。私はこれを回避する方法を知らない。

編集:私は意味

は、明らかにあなたが救う必要なく、

if (parentContext.hasChanges) { 
     [panrentContext save:nil]; 
} 
0

答えを行うことができ、フェッチ要求を使用することです。 、ドキュメントにあるものに非常に近いこのコードは、私の作品:私のプロジェクトで

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:subMOC]; 
[request setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self == %@", [[self superview] valueForKey:@"objectValue"]]; 
[request setPredicate:predicate]; 

err = nil; 
NSArray *array = [subMOC executeFetchRequest:request error:&err]; 
if (array != nil) 
{ 
    self.subObjectValue = [array objectAtIndex:0]; 
} 

が、私はまだそれが失敗した場合はフェッチ要求を使用して上記とだけ質問からコードを使用します。

+0

これはスレッドセーフな方法ではありません。ここにオブジェクト自体を渡します。管理オブジェクトIDの使用は安全です。しかし、私はあなたと同じ状況で立ち往生しています:) –

関連する問題