如何在核心数据中使用多线程保存对象?

时间:2010-03-16 23:27:54

标签: iphone cocoa-touch multithreading core-data

我从Web服务获取一些数据并将其保存在核心数据中。此工作流程如下所示:

  1. 获取xml Feed
  2. 遍历该Feed中的每个项目,为每个Feed项创建一个新的ManagedObject
  3. 为每个项目下载一些大的二进制数据并将其保存到ManagedObject
  4. 调用[managedObjectContext save:]
  5. 现在,问题当然是性能 - 一切都在主线程上运行。我想尽可能多地重新考虑另一个线程,但我不确定我应该从哪里开始。将所有内容(1-4)放到单独的线程中是否可以?

1 个答案:

答案 0 :(得分:2)

是的,我建议您查看Apple的多线程核心数据文档和我在MDN(Mac开发人员网络)http://www.mac-developer-network.com/columns/coredata/may2009/上的文章,其中讨论了您需要避免的事项以及如何设置所有内容。

BTW,将大量二进制数据保存到Core Data对象通常是一个坏主意。规则如下:

  • <实体中保存100KB
  • < 1MB保存在一个挂起关系的单独实体中
  •   

    1MB保存到磁盘并将其路径存储到托管对象

因此,您可以将二进制数据的下载拆分为单独的线程,将它们保存到磁盘,然后告诉主线程引用对象的NSManagedObjectID和路径,让主线程快速完成和简单的链接。这样可以让你的核心数据实现保持单线程,并且只会剥离数据下载。