可以将 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将特定数据列移动到另一指定数据列的前面

如何使用 ASP.NET 将文件从一台机器移动到另一台机器?

将所有内容从一台服务器移动到另一台服务器

如何将lvm卷移动到另一台服务器中

将保存的 TortoiseSVN 身份验证移动到另一台机器?