可以将NSmanagedObject移动到另一个NSManagedContext吗?

时间:2013-05-05 10:32:36

标签: ios objective-c cocoa-touch core-data

我有两个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的位置和时间。

2 个答案:

答案 0 :(得分:3)

如果您尝试在错误的上下文中使用NSManagedObject,则在保存时会出现异常。

如果您需要从临时上下文访问现有对象,则需要使用对象的ID来获取这样的新实例:

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

然后,当您保存背景上下文时,更改将持久保存到商店,您只需将这些更改恢复到主要上下文中。

答案 1 :(得分:2)

上下文之间唯一可以共享的是托管对象ID。你可以这样得到它:

NSManagedObjectID *objectID = self.user.objectID;

然后从其他上下文中获取等效对象:

User *backgroundUser = [backgroundContext obectWithID:objectID];

backgroundUser现在可以安全地与背景上下文中的其他对象一起使用。