我与两个many-to-many
Core Data
建立entities
关系。
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
实体所在的俱乐部数量。这也很慢。
还有其他方法可以检查实体是否有多个不会导致性能问题的关系,例如这两种方法吗?
答案 0 :(得分:0)
您可以在谓词中指定。如果你想取一些俱乐部等于一个数字的人,你可以这样做:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"clubs.@count", 0];
您可以找到有关谓词here的更多信息。我希望它适合你。
答案 1 :(得分:0)
在您要删除的俱乐部上,首先使用它的批量方法删除人物对象。传递给该方法的集合将是club.people集(或者你所谓的那种关系)。
获取现在没有任何俱乐部的人物(使用Pedro答案中的谓语)。
删除#2中的人。
当然,在第1步之后随时删除俱乐部。