可以将 NSmanagedObject 移动到另一个 NSManagedContext 吗?
Posted
技术标签:
【中文标题】可以将 NSmanagedObject 移动到另一个 NSManagedContext 吗?【英文标题】:Possible to move NSmanagedObject to another NSManagedContext? 【发布时间】:2013-05-05 10:32:35 【问题描述】:我有两个 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。
【问题讨论】:
【参考方案1】:如果您尝试在错误的上下文中使用 NSManagedObject,您将在保存时遇到异常。
如果您需要从临时上下文中访问现有对象,则需要使用对象的 ID 来获取新实例,如下所示:
NSManagedObject *user = ...;
NSManagedObject *userInBackgroundContext = [backgroundContext objectWithID:[user objectID]];
然后,当您保存后台上下文时,更改将持久保存到存储中,您只需将这些更改恢复到您的主上下文中。
【讨论】:
【参考方案2】:唯一可以在上下文之间共享的是托管对象 ID。可以这样获取:
NSManagedObjectID *objectID = self.user.objectID;
然后像这样从其他上下文中获取等效对象:
User *backgroundUser = [backgroundContext obectWithID:objectID];
backgroundUser 现在可以安全地与后台上下文中的其他对象一起使用。
【讨论】:
以上是关于可以将 NSmanagedObject 移动到另一个 NSManagedContext 吗?的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用dplyr将特定的数据列移动到最前面使用dplyr将特定数据列移动到另一指定数据列的后面使用dplyr将特定数据列移动到另一指定数据列的前面