4

2 つの NSManagedContext があり、1 つの親と 1 つの子が同時実行に使用されます。次のように指定します。

self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

self.backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType];
self.backgroundContext.parentContext = self.managedObjectContext;

ビュー コントローラーの 1 つで、このメソッドを呼び出します。

[Stream followingStreamForUser:self.user fromDictionary:dict inManagedObjectContext: [AppController sharedAppController].backgroundContext];

このメソッドを呼び出すと、次のエラーが発生します。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship '[...]' between objects in different contexts

self.user私の中にないようですbackgroundContextself.user自分のオブジェクトを自分のオブジェクトに移動できるかbackgroundContextどうか、またはユーザー オブジェクトがいつどこでコンテキスト X に追加されるかを確認 できるかどうか疑問に思います。

4

2 に答える 2

4

間違ったコンテキストで NSManagedObject を使用しようとすると、保存中に例外が発生します。

一時的なコンテキストから既存のオブジェクトにアクセスする必要がある場合は、オブジェクトの ID を使用して、次のように新しいインスタンスを取得する必要があります。

NSManagedObject *user = ...;
NSManagedObject *userInBackgroundContext = [backgroundContext objectWithID:[user objectID]];

次に、バックグラウンド コンテキストを保存すると、変更がストアに永続化され、それらの変更をメイン コンテキストに戻すだけで済みます。

于 2013-05-05T10:41:47.770 に答える
2

コンテキスト間で共有できる唯一のものは、管理対象オブジェクト ID です。次のようにして取得できます。

NSManagedObjectID *objectID = self.user.objectID;

次に、次のように他のコンテキストから同等のオブジェクトを取得します。

User *backgroundUser = [backgroundContext obectWithID:objectID];

backgroundUser は、バックグラウンド コンテキストの他のオブジェクトで安全に使用できるようになりました。

于 2013-05-05T10:40:56.993 に答える