Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.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
Iphone 处理多个托管对象上下文问题_Iphone_Objective C_Core Data_Merge_Nsmanagedobjectcontext - Fatal编程技术网

Iphone 处理多个托管对象上下文问题

Iphone 处理多个托管对象上下文问题,iphone,objective-c,core-data,merge,nsmanagedobjectcontext,Iphone,Objective C,Core Data,Merge,Nsmanagedobjectcontext,我目前通过几个并行执行的线程执行多个网络请求,因此每个线程都有一个托管对象上下文,每个线程都为核心数据实体设置属性值。因此,这是一个难题,每个网络请求一次只能获取少量数据,并且有数百(甚至数千)个这样的请求,我希望在所有网络操作发生后执行保存(因此我可以安全地假设保存的数据意味着所有内容都已成功下载并写入存储)。所以有两个问题: 我是在每个线程写入上下文后保存每个托管对象上下文,还是将所有托管对象上下文存储在内存中,并在循环结束时遍历所有托管对象上下文并执行保存?(写完这篇文章后,很明显,在路上

我目前通过几个并行执行的线程执行多个网络请求,因此每个线程都有一个托管对象上下文,每个线程都为核心数据实体设置属性值。因此,这是一个难题,每个网络请求一次只能获取少量数据,并且有数百(甚至数千)个这样的请求,我希望在所有网络操作发生后执行保存(因此我可以安全地假设保存的数据意味着所有内容都已成功下载并写入存储)。所以有两个问题:

  • 我是在每个线程写入上下文后保存每个托管对象上下文,还是将所有托管对象上下文存储在内存中,并在循环结束时遍历所有托管对象上下文并执行保存?(写完这篇文章后,很明显,在路上省钱是更有效的方法,但我还是想听听你的想法。)
  • 是否有任何方法可以在不执行保存操作的情况下合并托管对象上下文?我目前正在通过NSManagedObjectContextDidSaveNotification通知合并上下文,不知道是否还有其他方法

  • 您可以为所有线程创建一个控制器类,并且只使用一个托管上下文来保存数据

    线程完成下载后,在ThreadControler类中调用一个委托,将数据与旧数据合并,然后在所有线程完成下载后保存。 如果数据太大,可以进行一些中间保存

    我不知道如何“将所有托管对象上下文存储在内存中,并在循环结束时遍历所有托管对象上下文并执行保存”。每个MOC都应该限制在创建它的线程中,因此我不知道如何在不违反限制规则的情况下有效地循环所有MOC。。。但你可能已经意识到


    我还认为,通过NSManagedObjectContextDidSaveNotification合并MOC是最有效的方法。我甚至认为在每次对象插入后(例如,导入数据时)保存MOC是最容易的。这样可以最小化每次合并的范围!而且,由于合并是在内存中执行的,因此它们的开销很小,更细粒度。

    我看不出这是如何工作的。在多个线程上运行相同的上下文会导致TrainCrank。不是在多个线程上,而是在一个线程上,该线程将创建用于下载的线程,并且在一个线程完成后,只需通知ThreadControllClass您已完成某些数据或失败。+1这是唯一真正的解决方案。您可以基于其他两个通知进行合并,但这将非常非常缓慢。感谢您的回复。我对它进行了更多的思考,我认为明确地合并上下文甚至是不必要的,除非我想在内存中的其他MOC上刷新数据,对吗?考虑到当我导入数据时,我不需要立即刷新它,我只能不合并,当我需要引用新数据时,我可以执行提取。你怎么认为?我想得对吗?你如何在不同的环境中传达变化完全取决于你。在每次导入之后,将更改合并到主MOC中,这样做的好处是您不必在导入完成后执行额外的获取。此外,它还能保持主主运行中心的连贯性。如果你不在乎,你可以跳过合并。正如我所说,这完全取决于你,想想什么对你的特定用例更有意义。你将产生“数千”个线程/操作?是的,这听起来很愚蠢,我知道,但它不会一次完成,实际上只有2或3个线程在同一时间运行。其目的是从web服务器中提取数据。