NSPredicate可以在另一个数组中的对象所拥有的数组中搜索对象吗?

时间:2009-09-16 17:12:13

标签: iphone objective-c

我已经阅读了NSPredicate文档,但无法完全绕过它。我能理解的简单谓词,但现在如何为以下情况创建谓词:

我有一个Foo对象数组。在Foo类中,其中一个iVars是Bar对象的NSMutableArray。我需要过滤Foo对象的数组,以获得在其数组中具有特定Bar对象的对象。怎么样?

此外,是否更容易(或可能)一次找到多个Bar对象,或者组合多个谓词来搜索特定的Bar?

2 个答案:

答案 0 :(得分:3)

您的问题可以分为两个问题,我会尝试按顺序回答。

  1. 您可以在Foo个实例上定义谓词,只有当实例的Bar对象数组包含与单独谓词匹配的Bar实例时,该谓词才为真。你想要的是一个[SUBQUERY][1]表达式。像这样的谓词字符串将匹配Foo值为10的fooInt个实例,并且Bar属性中barArray个实例的barInt值为SUBQUERY(collection, $var, predicate) 1:

    @“fooInt == 10&& SUBQUERY(barArray,$ x,$ x.barInt == 1)。@ count> 0”

    SUBQUERY表达式的一般格式为SUBQUERYcollection表达式返回predicate中与@count匹配的对象集合,因此将其Foo告诉您Bar实例是否有{{1}与子查询谓词匹配的实例。

  2. 您可以在SUBQUERY表达式中包含任意复杂的谓词(包括嵌套的SUBQUERY表达式)。鉴于包含SUBQUERY表达式的谓词通常很昂贵(它们大致对应于SQL JOIN),使用{{1}在一个Bar表达式中搜索多个SUBQUERY实例可能更好然后在OR的结果中测试相应的@count。像

    这样的谓词字符串

    @“fooInt == 10&& SUBQUERY(barArray,$ x,$ x.barInt == 1 || $ x.barInt == 2)。@ count> = 2”

    SUBQUERY个实例Foo个实例Bar == 1 barInt个实例Bar == 2 barInt个实例1}}实例的Foo

答案 1 :(得分:3)

我找到了我要找的东西:

@class Foo {
  int var1;
  NSArray *barObjs;
}

predicate = @"var1 == 5 AND ANY barObjs.id == 5";