2

我遇到了 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 之间关系的数据时,我都会创建具有相应属性值的关系实体实例。

每隔一段时间,我都会遍历“关系”实体的所有实例,并尝试创建如下适当的关系:

  1. 获取“关系”实体的所有实例
  2. 对于每个获取的关系,根据存储在关系中的“class_A_id”和“class_B_id”id,获取 ClassA 和 ClassB 的实例
  3. 如果两者 - ClassA 和 ClassB 的实例都存在 - 在它们之间创建关系。
  4. 从 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 中实现这样的查询?在那里使用子查询?是 - 怎么样?:)

4

1 回答 1

0

如果我理解正确,如果您不想过多地修改模型,则有两种选择:

  • 第一个选项:修改请求过程以仅询问您已经拥有的实体的关系,如果您没有那么多类型 A、B 的实体,这可以很容易地完成。否则实施某种“增量”,这将避免拥有数千个您不需要的关系(除非您需要它用于其他目的)。
  • 第二种选择:当您下载项目时,我想它是一个后台进程,在这种情况下,我会立即在那里进行检查,而不是不时进行批处理。比如你正在下载关系,检查你是否已经有A或B,并将关系表标记为完整或不完整(可能添加两个属性aExists bExists)。实体 A 进入后,立即将关系中的所有实体标记为 aExists,B 进入也是如此,这是一个正常的获取请求,其中 class_A_id 存在。然后批处理可以轻松扫描并仅获取标记为完成的那些实体,并创建关系。你必须实现一点逻辑,但在我看来,事情会变得更快。

新的关系将是:

Relationships {
  class_A_id,
  class_B_id,
  classAexists BOOL,
  classBexists BOOL,
  batchRelationshipCreated BOOL,
}

好吧,无论如何您都可以实现这两个选项:-)

于 2013-10-03T10:39:28.870 回答