この種のことを実現する正しい方法は、新しい管理対象オブジェクトコンテキストを使用することです。同じ永続ストアを使用して管理対象オブジェクトコンテキストを作成します。
NSManagedObjectContext *tempContext = [[[NSManagedObjectContext alloc] init] autorelease];
[tempContext setPersistentStore:[originalContext persistentStore]];
次に、新しいオブジェクトを追加したり、それらを変更したりします。
保存するときは、tempContextで[tempContext save:...]を呼び出し、保存通知を処理して元のコンテキストにマージする必要があります。オブジェクトを破棄するには、この一時的なコンテキストを解放して、忘れてください。
したがって、一時コンテキストを保存すると、変更はストアに保持され、それらの変更をメインコンテキストに戻す必要があります。
- (void)tempContextSaved:(NSNotification *)notification {
[originalContext mergeChangesFromContextDidSaveNotification:notification];
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(tempContextSaved:)
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
[tempContext save:NULL];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
これは、マルチスレッドのコアデータ操作を処理する方法でもあります。スレッドごとに1つのコンテキスト。
この一時的なコンテキストから既存のオブジェクトにアクセスする必要がある場合(リレーションを追加するなど)、オブジェクトのIDを使用して次のような新しいインスタンスを取得する必要があります。
NSManagedObject *objectInOriginalContext = ...;
NSManagedObject *objectInTemporaryContext = [tempContext objectWithID:[objectInOriginalContext objectID]];
をNSManagedObject
間違ったコンテキストで使用しようとすると、保存中に例外が発生します。