找到关系数量非常慢

时间:2017-04-20 18:37:50

标签: ios objective-c core-data

我与两个many-to-many Core Data建立entities关系。

enter image description here

Person实体可以是许多不同俱乐部的一部分。所以,当我删除一个俱乐部时,我也希望删除与所有Person实体的关系。如果该人实体与Clubs没有任何其他关系,我会从Core Data删除该关系,如果它确实有其他关系,我只需从Person移除Club而不是删除。

要检查Person是否有其他关系我正在使用objectIDsForRelationshipNamed:方法并查看NSArray计数是否大于1.如果是,则删除实体从关系中,如果不是,我将其从核心数据中删除。

for (ZSSCDPerson *person in self.items) {

    NSUInteger relationshipCount = [person objectIDsForRelationshipNamed:@"clubs"];// Slow
    NSUInteger relationshipCount2 = person.clubs.count;// Also slow
    if (relationshipCount > 1) {

        [privateClub removePersonObject:person];

    } else {

        [self.managedObjectPrivateContext deleteObject:person];

    }

}

问题

使用objectIDsForRelationshipNamed:的速度很慢。使用工具和Time Profiler我可以看到这一点。我改为使用person.clubs.count来查看Person实体所在的俱乐部数量。这也很慢。

还有其他方法可以检查实体是否有多个不会导致性能问题的关系,例如这两种方法吗?

2 个答案:

答案 0 :(得分:0)

您可以在谓词中指定。如果你想取一些俱乐部等于一个数字的人,你可以这样做:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"clubs.@count", 0];

您可以找到有关谓词here的更多信息。我希望它适合你。

答案 1 :(得分:0)

  1. 在您要删除的俱乐部上,首先使用它的批量方法删除人物对象。传递给该方法的集合将是club.people集(或者你所谓的那种关系)。

  2. 获取现在没有任何俱乐部的人物(使用Pedro答案中的谓语)。

  3. 删除#2中的人。

  4. 当然,在第1步之后随时删除俱乐部。