我有一个3级嵌套for循环:
for (Region *region in group.associatedRegions) {
for (Boundary *regionBoundary in region.boundaries) {
for (Boundary *groupBoundary in group.boundaries) {
if ([groupBoundary.boundaryID isEqualToNumber:regionBoundary.boundaryID]) {
[boundarySet addObject:groupBoundary];
}
}
}
}
这很有效。它足够快,不会减慢应用程序的速度。我不喜欢它。我非常厌恶这种嵌套水平。
我很确定我可以使用NSPredicate
搜索做同样的事情。我的SQL不是很好,所以我不知道从哪里开始。
Group
,Region
和Boundary
都是Core Data
NSManagedObject
s。
每个Group
与边界有多对多的关系,与区域有1对多的关系。每个Region
都与边界有多对多的关系。
要点是,Group
有一组可以看到的边界。 Region
有一组可以看到的边界。 Region
可能包含Boundary
无法看到的Group
,因此需要将其排除。
因此,对于每个Region
,我需要找到Group
和Region
都可以看到的边界集。
有什么建议吗?
答案 0 :(得分:0)
老实说,我没有对此进行测试,我甚至不知道它是否会成功解析。但即使它不是你想要的,它也可能为它的变化提供一些想法。假设您正在获取与Boundary
实体建立关系groups
的{{1}}个对象,而Groups
实体与associatedRegions
实体之间的关系为Regions
:< / p>
NSPredicate *predicate = [NSPredicate predicateWithFormat:"SUBQUERY(groups, $G, $G = %@ AND SUBQUERY($G.associatedRegions, $R, SUBQUERY($R.boundaries, $B, self = $B).@count >0).@count >0)).@count > 0", group];
我希望这样做是获取Boundary
个对象,其中:至少有一个组
a)匹配所选的group
和
b)至少有一个Region
,其中至少有一个Boundary
是有问题的边界。