我首次推出iOS应用程序时,会从Web服务中导入约18,000个相互关联的各种实体的记录.这些记录在网络上的数据库中都有自己的唯一标识符.我已经阅读并重新阅读了苹果的文档,cimgf的博客条目,Marcus Zarra的关于核心数据的书籍,并重新看了iDeveloper TV的核心数据系列.我无法弄清楚导入实体A的方法,而不会将实体B,C和D保存在内存中或执行昂贵的提取并维护实体之间的关系.如果我不使用核心数据,我可以使用已经建立的唯一标识符,导入速度会更快.
如果你有任何建议,我都是耳朵.
我们已经在Android中实现了这一策略,而进口需要大约2.5分钟,而在iOS上大约6分钟,不同设备上的硬件可比较.缩短进口时间对我们的用户至关重要,所以我在这个问题上没有妥协.在此先感谢您的帮助.
编辑:
这是我目前正在做的 – 我创建一个创建自己的上下文的NSOperation.我进口实体B,C和D首先保持每个实体类型的数组.然后我导入实体A,并使用谓词过滤实体B,C和以便将实体A与B,C和C中的适当实体相关联. D.我按照当前正在导入的实体类型,根据不同的优化间隔批量保存上下文.
我不只是导入到一个表,我导入许多相互关联的表.所以如果我导入实体B,我必须将实体B保留在内存中,或者在需要它时将实体B与实体A相关联
解决方法
我将提出每个Core Data问题获得的相同问题,然后继续:确保您真的想使用Core Data,而不仅仅是直接使用sqlite.核心数据用于持久化对象图,而不是通用数据库.如果您已经为Android实施了数据库,那么您可能希望在iOS上使用相同的架构和设计.
好的,没办法.我们假设CD是这里工作的最佳工具(或者你现在不能改变).我的第一个想法是作弊.这是我早期的想法之一….
看到你可以快速地插入这些对象,没有关系.如果速度足够快,那么这是你的欺骗方式:首先不要存储实际的关系.存储描述关系的标识符的字符串列表.然后,一旦所有的东西被加载并且用户可以开始工作,随着时间的推移将字符串关系转换成后台的真实关系.每当你获得记录时,你需要检查是否有一个骗子属性仍然设置,如果是这样,你需要手动获取关系(然后清除骗子属性).
这并没有使进口更快,但它给人的幻觉更快,这就是iOS 90%的时间.您可能甚至必须阻止某些操作(如删除),直到您完成粘贴所有内容,但这可能还要比完全阻止用户更好.