使用NSPredicate for Core Data调用替换For循环

时间:2015-05-04 20:12:35

标签: objective-c core-data nspredicate

我有一个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不是很好,所以我不知道从哪里开始。

GroupRegionBoundary都是Core Data NSManagedObject s。

每个Group与边界有多对多的关系,与区域有1对多的关系。每个Region都与边界有多对多的关系。

要点是,Group有一组可以看到的边界。 Region有一组可以看到的边界。 Region可能包含Boundary无法看到的Group,因此需要将其排除。

因此,对于每个Region,我需要找到GroupRegion都可以看到的边界集。

有什么建议吗?

1 个答案:

答案 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是有问题的边界。