我有两个模型,它们之间有多对多关系。模型A在一个空状态下启动,而模型B有大约22万个记录(具有相当大的容量)大索引,但这应该不会影响,因为这个模型永远不会更新)。
从A到>B的to-many如下:
- optional => false
- transient => false
- indexed => true
- ordered => true
- minCount => 0 maxCount => NSIntegerMax
- deleteRule => NSCascadeDeleteRule
B->A的to-many如下:
- optional => true
- transient => false
- indexed => false
- ordered => false
- minCount => 0 maxCount => NSIntegerMax
- deleteRule => NSNullifyDeleteRule
当然,每个关系都是互为倒数的。我的问题是在创建新实体a之前,应用程序执行a取回请求获取实体b的2k条记录,然后,应用设置将这些记录发送到将要创建的实体A,然后保存上下文。问题是将2k条记录的nsorderedset设置为实体A实例在安装了iOS 6.0.1的iPhone 4S上多花了4秒,然后保存在同一设备中,上下文多花了4秒。这使得8秒创建模型a的新实例
我已经尝试启用/禁用模型A中的索引关联属性,但是这没什么区别。我正在努力完成的任务太繁重了实现吗?
在进行一些测试时,我观察到大多数时间都没有设置nsorderedset到实体A实例是因为反向关系。我做了一个快速测试,将多对多关系更改为多对多关系与目标模型成反比,则插入时间降为一半的时间。当然,这打破了多对多关系。只是一个快速测试。
我错过了什么吗?由于应用程序只保存了一次上下文,而不是每条记录一次B,保存2k不应该花那么长时间但我是iPhone开发的新手,也许我正在执行的这个任务对这种设备来说太贵了。
任何提示将非常感激。谢谢!
Ferdev,
谢谢你的问题写得好。很明显,在寻求帮助之前,你已经仔细考虑过你的问题。这对每个人都有帮助。
Core Data在保存时似乎没有使用块操作。因此,您将在那里遇到性能问题。关系的建立应该比你看到的要快。(顺便说一句,大多数性能问题都是由闪存的速度驱动的。它在iOS设备上很慢。因此,预取使MOC与数据保持同步非常重要。)
我做了一些观察:
为什么A->B对多关系既是索引的又是有序的?排序会减慢插入的速度。为关系建立索引也有意义吗?
您是否在使用批量关系设置器(-add<Key>:
)?
您是否在将实体B的2000条记录设置为实体A实例之前获取它们?
即使这不会影响插入性能,为什么从A到>B的删除规则要级联呢?你上面写的实体B不变
安德鲁