【问题标题】:Working with Multiple Managed Object Contexts Questions使用多个托管对象上下文问题
【发布时间】:2011-10-04 07:48:47
【问题描述】:

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

  1. 是在每个线程完成对上下文的写入后保存每个托管对象上下文,还是将所有托管对象上下文存储在内存中,最后循环遍历所有对象并执行保存? (写完后,很明显,随时随地保存会是更有效的方法,但我仍然想听听您的想法。)
  2. 有什么方法可以在不执行保存操作的情况下合并托管对象上下文?我目前正在通过 NSManagedObjectContextDidSaveNotification 通知合并上下文,想知道是否还有其他方法。

【问题讨论】:

  • 你要产生“数千”个线程/操作?
  • 是的,这听起来很愚蠢,我知道,但不会一下子全部完成,实际上只有 2 或 3 个线程会同时运行。目的是从 Web 服务器中提取数据。

标签: iphone objective-c core-data merge nsmanagedobjectcontext


【解决方案1】:

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

我也相信通过 NSManagedObjectContextDidSaveNotification 合并 MOC 是最有效的方法。我什至会争辩说,在每个对象插入后(例如,当您导入数据时)保存 MOC 是最简单的。这样你就可以最小化每次合并的范围!而且由于合并是在内存中执行的,因此更精细的合并几乎没有开销。

【讨论】:

  • +1 这是唯一真正的解决方案。您可以根据其他两个通知进行合并,但这会非常非常慢。
  • 感谢您的回复。我给了它更多的思考,我认为甚至没有必要明确合并上下文,除非我希望在当前内存中的其他 MOC 上刷新数据,对吗?考虑到在我导入数据时,我不需要立即刷新它,我只能不合并,当我需要引用新数据时,我可以执行获取。你怎么看?我的想法正确吗?
  • 如何在上下文之间传达变化完全取决于您。例如,在每次导入后将更改合并到主 MOC 的优点是您不必在导入完成后执行额外的提取。此外,它使您的主要 MOC 保持连贯性。如果您不关心这一点,则可以跳过合并。正如我所说,这完全取决于你,想想什么对你的特定用例更有意义。
【解决方案2】:

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

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

【讨论】:

  • 我不明白这是如何工作的。在多个线程上运行相同的上下文会导致故障。
  • 不是在多个线程上,而是在一个线程上创建下载线程,在一个线程完成后通知 ThreadControllrClass 你已经完成了一些数据或者你已经失败了。
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多