Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何在不同的NSManagedObject上下文中设置从一个NSManagedObject到另一个NSManagedObject的关系_Multithreading_Core Data_Relationship_Nsmanagedobject_Nsmanagedobjectcontext - Fatal编程技术网

Multithreading 如何在不同的NSManagedObject上下文中设置从一个NSManagedObject到另一个NSManagedObject的关系

Multithreading 如何在不同的NSManagedObject上下文中设置从一个NSManagedObject到另一个NSManagedObject的关系,multithreading,core-data,relationship,nsmanagedobject,nsmanagedobjectcontext,Multithreading,Core Data,Relationship,Nsmanagedobject,Nsmanagedobjectcontext,因为我的应用程序是多线程的,所以我使用了两个NSManagedObjectContext。在主线程中运行的主上下文和仅在单独线程中运行的另一上下文 我已经创建了一个小的测试应用程序。它有两个核心数据实体。父母和孩子。父对象与子对象之间存在一对多关系。子项与父项具有1-1关系 在一个测试方法(在一个单独的线程中运行)中,我得到一个父实例,它是在以前的运行时创建的。所以这是在主要的背景下。我使用以下代码行获取此父级: Parent *tmpParent = [[parentController se

因为我的应用程序是多线程的,所以我使用了两个NSManagedObjectContext。在主线程中运行的主上下文和仅在单独线程中运行的另一上下文

我已经创建了一个小的测试应用程序。它有两个核心数据实体。父母和孩子。父对象与子对象之间存在一对多关系。子项与父项具有1-1关系

在一个测试方法(在一个单独的线程中运行)中,我得到一个父实例,它是在以前的运行时创建的。所以这是在主要的背景下。我使用以下代码行获取此父级:

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只能位于(或由)单个NSManagedObject上下文中

我查阅了文档,但找不到解决这个问题的方法


问题:当父对象与子对象位于不同的NSManagedObjectContext中时,如何设置子对象与父对象的关系???

可以从另一个上下文加载对象,因此,当您在另一个线程中创建新的NSManagedObject时,没有任何东西可以阻止您获取现有的NSManagedObject,该对象可能在主线程中使用,也可能不在主线程中使用,并使用该引用来建立您的关系


当您退出线程并合并上下文时,此更改将更新到主线程内存中的对象。因此,当您在其他线程中创建新的NSManagedObject时,没有任何东西可以阻止您获取现有的NSManagedObject,该对象可能在主线程中使用,也可能不在主线程中使用,并使用该引用来建立您的关系

当您退出线程并合并上下文时,此更改将更新到该对象,该对象在此之前一直在主线程的内存中愉快地存在。

与love一起喝一杯:;)获取就像sql中的select查询,它只是从storeHehe加载对象:“从核心数据中获取数据比文档告诉您的要容易得多。”:D我明天会尝试报告。非常感谢!:)用爱喝点可可:;)获取就像sql中的select查询,它只是从storeHehe加载对象:“从核心数据中获取数据比文档告诉您的要容易得多。”:D我明天会尝试报告。非常感谢!:)