如何利用ios中的核心数据提高大数据导入性能

Ros*_*man 9 sqlite core-data ios

我在首次启动iOS应用程序时从Web服务导入~18,000个相互关联的各种实体的记录.记录在Web上的数据库中有自己唯一的标识符.我阅读并重新阅读了苹果的文档,cimgf的博客文章,Marcus Zarra关于核心数据的书籍,并一遍又一遍地观看了iDeveloper TV关于核心数据的系列文章.我无法想出一种方法来导入实体A而不将实体B,C和D保留在内存中或执行昂贵的提取并维护实体之间的关系.如果我没有使用核心数据,我将能够使用已经建立的唯一标识符,导入速度会快得多.

如果您有任何建议,我会全力以赴.

我们在Android中实现了这个策略,导入需要大约2.5分钟,相比之下,iOS上大约需要6分钟,不同设备上的硬件可以比较.缩短导入时间对我们的用户至关重要,因此我无法在此问题上妥协.在此先感谢您的帮助.

编辑:

这就是我目前正在做的事情 - 我创建了一个NSOperation来创建它自己的上下文.我首先导入实体B,C和D,并为每个实体类型保留一个数组.然后我导入实体A并使用谓词来过滤实体B,C和D的数组,以便将实体A与B,C和D中的相应实体相关联.我是以优化的间隔批量保存上下文的.根据我当前导入的实体类型而有所不同.

我不只是导入到一个表,我导入了许多彼此相关的表.因此,如果我导入实体B,我必须将实体B保留在内存中,或者在需要它时将实体B与实体A相关联.有意义吗?

Rob*_*ier 9

我会在每个Core Data问题中提出相同的问题,然后继续:确保你真的想要使用Core Data而不仅仅是sqlite.核心数据用于持久化对象图,而不是通用数据库.如果您已经为Android实现了数据库,那么您可能希望在iOS上使用相同的架构和设计.

好的,把它弄清楚了.让我们假设CD确实是这里工作的最佳工具(或者你现在无法改变它).我在这里首先想到的是作弊.当然,这通常是我早期的想法之一......

了解在没有关系的情况下插入这些对象的速度有多快.如果这个足够快,那么这就是你作弊的方式:最初不要存储实际关系.存储描述关系的标识符的字符串列表.然后,一旦所有内容都加载并且用户可以开始工作,随着时间的推移将字符串关系转换为后台中的真实关系.每当你获取一条记录时,你需要检查它是否仍然设置了骗子属性,如果是,你需要手动获取它的关系(然后清除骗子属性).

这并不能使完全导入更快,但它会让人觉得它更快,这就是iOS中90%的目标.你可能甚至必须阻止某些操作(比如删除),直到你完成粘合所有内容,但这可能仍然比完全阻止用户更好.


Mar*_*rez 5

听起来你正经历着这个家伙经历的同样的痛苦,他最终扯掉了Core Data.一定有更好的方法! http://inessential.com/2010/02/26/on_switching_away_from_core_data