4

我有两个 NSManagedContext,一个父级和一个子级用于并发。指定如下:

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

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

在我的一个视图控制器中,我将此方法称为:

[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不在我backgroundContext的 我想知道是否可以将我的self.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 回答