我遇到了 iOS Core Data 性能问题。
假设我们有 2 个类:“Class_A”和“Class_B”。他们都有自己的 id 和彼此之间的一对一关系。
现在让我们假设我正在从允许我创建这些类的网络上下载数据(数据包含 A 类和 B 类的 id,以及有关它们的关系的信息)。例如:
- “将有 id=1 的 Class_A 实例”
- “将有 id=2 的 Class_A 实例”
- “会有 id=3 的 Class_A 实例”
- “将有 id=10 的 Class_B 实例”
- “将有 id=11 的 Class_B 实例”
- “将有 id=12 的 Class_B 实例”
- “id=1 的 Class_A 将与 id = 12 的 Class_B 连接”
- “id=2 的 Class_A 将与 id = 11 的 Class_B 连接”
- “id=3 的 Class_A 将与 id = 10 的 Class_B 连接”
因为所有这些信息都可以按随机顺序获取(例如,关于 X 和 Y 类之间的连接的信息可以在关于 X 和 Y 类的存在信息之前下载),所以我使用了另一种实体:关系。
关系包含 2 个字段:class_A_id 和 class_b_id
每次我收到有关 ClassA 和 ClassB 之间关系的数据时,我都会创建具有相应属性值的关系实体实例。
每隔一段时间,我都会遍历“关系”实体的所有实例,并尝试创建如下适当的关系:
- 获取“关系”实体的所有实例
- 对于每个获取的关系,根据存储在关系中的“class_A_id”和“class_B_id”id,获取 ClassA 和 ClassB 的实例
- 如果两者 - ClassA 和 ClassB 的实例都存在 - 在它们之间创建关系。
- 从 CoreData 中删除实例关系
在实现了这个算法之后,我发现它在 Core Data 中使用相当少量的对象时效果很好。问题是我存储了数千个“关系”实体(首先下载有关它们的信息),而有关“ClassA”和“ClassB”存在的信息的下载频率较低。
结果是,每次我尝试使用“关系”实体创建关系时,我都会获取数千个包含不存在的类 id 的对象!
所以我对这个问题的解决方案是增强所提出算法的第一步:
与其获取 CoreData 中的所有关系,不如仅获取那些包含系统中存在的类的 id 的关系。
在 SQL 中,它可能看起来像这样:
SELECT * from 'Relationship' where
(SELECT * from 'ClassA' where id == class_A_id).count == 1
AND
(SELECT * from 'ClassB' where id == class_B_id).count == 1
我的问题是 - 如何在 CoreData 中实现这样的查询?在那里使用子查询?是 - 怎么样?:)