核心数据和线程

时间:2010-02-02 04:53:42

标签: cocoa core-data macos

使用核心数据和线程有哪些晦涩难关?我已经阅读了很多文档,到目前为止,我在文档中或通过痛苦的经历遇到了以下内容:

  • 为每个线程使用新的NSManagedObjectContext,但对于整个应用程序,单个NSPersistentStoreCoordinator就足够了。
  • 在将NSManagedObject的objectID发送回主线程(或任何其他线程)之前,请确保已保存上下文(或者至少,它不是新插入但尚未保存的对象) - 否则objectID实际上是临时ID而不是持久ID。
  • 使用mergeChangesFromContextDidSaveNotification:检测另一个线程中何时发生保存,并使用该保存将这些更改与当前线程的上下文合并。

奖金问题/观察:我被引导相信一些文档的措辞mergeChangesFromContextDidSaveNotification:主线程只需要将更改合并到工作线程的“主”上下文中 - 但我不知道认为就是这样。

我设置我的导入器来创建批量数据,这些数据是使用拥有它自己的上下文的NSOperation的子类导入的。操作被加载到NSOperationQueue中,该QSO设置为允许默认的并发操作数,因此可以同时运行多个导入批次。我偶尔会得到非常奇怪的验证错误和异常(比如尝试将nil添加到关系中)以及我在主线程上执行所有相同操作时从未见过的其他失败。它发生在我身上(也许这应该是显而易见的)可能需要为每个线程中的所有上下文完成上下文合并 - 而不仅仅是“主要”线程!我不知道为什么我之前没有想到这一点,但我认为这有帮助。 (尽管如此,它还没有经过足够的测试,但我确信。)在任何情况下,您是否需要观察可能使用相同数据集并添加/更新所有导入线程的通知相同的实体?如果是这样,这是IMO的另一个陷阱要点,尽管我还没确定它会起作用。

考虑到我在Core Data中遇到了多少这些(而不仅仅是多线程),我不得不想知道还有多少潜伏。由于多线程经常因为时间问题而难以复制的错误(如果不是不可能的话),我想我会问有没有其他重要的事情,我可能会遗漏,我需要关注自己。< / p>

1 个答案:

答案 0 :(得分:2)

有一大堆专门讨论Core Data and Threading主题的文档。

从您的问题集中不清楚该文档未涵盖的内容。