我有两个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的位置和时间。
答案 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现在可以安全地与背景上下文中的其他对象一起使用。