如何在不同的 NSManagedObjectContext 中设置从一个 NSManageObject 到另一个的关系
Posted
技术标签:
【中文标题】如何在不同的 NSManagedObjectContext 中设置从一个 NSManageObject 到另一个的关系【英文标题】:How to set a relationship from one NSManageObject to another in a different NSManagedObjectContext 【发布时间】:2011-12-01 18:34:45 【问题描述】:因为我的应用程序是多线程的,所以我使用了两个 NSManagedObjectContexts。在主线程中运行的主上下文和仅在单独线程中运行的另一个上下文。
我创建了一个小型测试应用程序。它有两个核心数据实体。父母和孩子。 Parent 与 Child 是一对多的关系。 Child 与 Parent 是一对一的关系。
在一个测试方法(在单独的线程中运行)中,我得到了一个 Parent 实例,它是在之前的运行时创建的。所以它在主要上下文中。我用这行代码得到了这个父:
Parent *tmpParent = [[parentController selectedObjects] objectAtIndex:0];
然后我在线程上下文 (managedObjectContextInBackground) 中创建一些子项,将它们的父级设置为 tmpParent,给它们命名并保存线程上下文:
Child *child1 = (Child *)[NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:managedObjectContextInBackground];
[child1 setName:@"Homer"];
[child1 setParent:tmpParent];
Child *child2 = (Child *)[NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:managedObjectContextInBackground];
[child2 setName:@"Wilma"];
[child2 setParent:tmpParent];
[self saveManagedObjectContextInBackground];
如果我执行该方法,应用程序将崩溃并显示: 非法尝试在不同上下文中的对象之间建立“父级”关系
这就是我在 tmpParent 声明下方添加这一行的原因:
[managedObjectContextInBackground insertObject:tmpParent];
但是,应用程序再次崩溃说: 一个 NSManagedObject 只能在一个 NSManagedObjectContext 中(或被一个 NSManagedObjectContext 观察到)
我查看了文档,但找不到解决此问题的方法。
问题:当 Parent 与 Child 位于不同的 NSManagedObjectContext 时,如何设置 Child 与 Parent 的关系??
【问题讨论】:
【参考方案1】:您的对象可以从另一个上下文中加载,因此,当您在另一个线程中创建一个新的 NSManagedObject 时,没有什么能阻止您获取现有的 NSManagedObject 可能会或可能不会在主线程中使用,并使用该引用为了建立你们的关系。
当您退出线程并合并上下文时,此更改将针对在此之前愉快地存在于主线程内存中的对象进行更新。
【讨论】:
用爱来点可可吧:cocoawithlove.com/2008/03/core-data-one-line-fetch.html ;) fetch 就像 sql 中的 select 查询,它只是从 store 中加载对象 呵呵:“从 Core Data 中获取数据比文档告诉你的要容易得多。” :D 明天我会试试那个报告。到目前为止感谢! :)以上是关于如何在不同的 NSManagedObjectContext 中设置从一个 NSManageObject 到另一个的关系的主要内容,如果未能解决你的问题,请参考以下文章
在 NSManagedObjectContextObjectsDidChangeNotification 中 NSUpdatedObjectsKey 和 NSRefreshedObjectsKey 有
过滤后的 SwiftUI CoreData 列表中的 Sum 属性