NSPredicateexpression式中SUBQUERY的快速说明

似乎没有关于苹果的SUBQUERY关键字的文档,我无法在SO或Google上find关于它的简单解释。 这是一个阴谋! ;)

请问内圈的人可否提供一个简单的语法解释,以便我可以使用它?

SUBQUERY(Bs, $x, $x IN %@) 

谢谢

这是一个子查询评估的内容。 (从这个邮件列表线程find,#1命中谷歌“NSPredicate子查询”)。这一点的文档还解释了谓词格式string语法如何与它相关联。

而对于那些不太清楚文档内容的人来说, SUBQUERY本质上是这样的:

 SUBQUERY(collection, variableName, predicateFormat) 

而且可以(简单地)像这样实现:

 id resultingCollection = ...; //a new collection, either a mutable set or array NSMutableDictionary * substitutions = [NSMutableDictionary dictionary]; NSPredicate * p = [NSPredicate predicateWithFormat:predicateFormat]; for (id variable in collection) { [substitutions setObject:variable forKey:variableName]; NSPredicate * filter = [p predicateWithSubstitutionVariables:substitutions]; if ([filter evaluateWithObject:collection] == YES) { [resultingCollection addObject:variable]; } } return resultingCollection; 

所以简而言之, SUBQUERY基本上是基于SUBQUERY的谓词expression式来SUBQUERY对象的集合并过滤出各种对象,然后返回结果集合。 (而谓词本身可以包含其他的SUBQUERY s)

例:

 NSArray * arrayOfArrays = [NSArray arrayWithObjects: [NSArray arrayWithObjects:....], [NSArray arrayWithObjects:....], [NSArray arrayWithObjects:....], [NSArray arrayWithObjects:....], [NSArray arrayWithObjects:....], [NSArray arrayWithObjects:....], nil]; NSPredicate * filter = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $a, $a.@count > 42)"]; NSArray * filtered = [arrayOfArrays filteredArrayUsingPredicate:filter]; //"filtered" is an array of arrays //the only arrays in "filtered" will have at least 42 elements each 

这里有一个很好的解释和例子的文章。

子查询代表一个关系(第一个参数 – Bs )的所有对象(第二个参数 – $x – 就像foreach中的一个variables名)上的谓词(第三个参数 – $x IN %@ )。 与常规查询类似,返回对象列表。

我在很多地方看到人们几乎用教条式使用$x ,但是在objects关系中的$object也是完全合理的(或者$city中的$city ):)