我已经阅读了NSPredicate文档,无法将我的头一直包裹在它的周围。我可以理解的简单谓词,但是现在如何为以下情况创建一个谓词:NSPredicate可以搜索另一个数组中的对象拥有的数组中的对象吗?
我有一个Foo对象数组。在Foo类中,其中一个iVars是Bar对象的NSMutableArray。我需要过滤Foo对象的数组以获得那些在其数组中具有特定Bar对象的对象。怎么样?
另外,它是否更容易(或可能)一次查找多个Bar对象,或者组合多个谓词来搜索特定的Bar?
我已经阅读了NSPredicate文档,无法将我的头一直包裹在它的周围。我可以理解的简单谓词,但是现在如何为以下情况创建一个谓词:NSPredicate可以搜索另一个数组中的对象拥有的数组中的对象吗?
我有一个Foo对象数组。在Foo类中,其中一个iVars是Bar对象的NSMutableArray。我需要过滤Foo对象的数组以获得那些在其数组中具有特定Bar对象的对象。怎么样?
另外,它是否更容易(或可能)一次查找多个Bar对象,或者组合多个谓词来搜索特定的Bar?
我已经找到了我要找:
@class Foo {
int var1;
NSArray *barObjs;
}
predicate = @"var1 == 5 AND ANY barObjs.id == 5";
您的问题可以分为两个问题,我会尽量按顺序回答。
您可以定义Foo
情况下断言,只有当Bar
对象的实例的数组包含一个Bar
实例匹配一个单独的谓词是真的。你想要的是一个[SUBQUERY][1]
表达式。像这样的谓词字符串是匹配的Foo
实例为10的fooInt
值和在barArray
属性Bar
实例具有barInt
值的1:
@“fooInt == 10 & & SUBQUERY(barArray,$ X ,$ x.barInt == 1)。@ count> 0“
SUBQUERY表达式的一般格式是SUBQUERY(collection, $var, predicate)
。 A SUBQUERY
表达式返回匹配predicate
的collection
中的对象集合,因此如果Foo
实例具有与子查询谓词相匹配的Bar
实例,则会采用它@count
。
您可以在SUBQUERY
表达式中包含任意复杂的谓词(包括嵌套的SUBQUERY
表达式)。鉴于含子查询表达式谓词是执行(它们大致对应于一个SQL JOIN
)通常是昂贵的,它可能会更好在SUBQUERY
的结果使用OR
搜索多个Bar
实例在一个SUBQUERY
表达式,然后用于测试的合适@count
。像
@谓词字符串 “fooInt == 10 & & SUBQUERY(barArray,$ X,$ x.barInt == 1 || $ x.barInt == 2)。@计数> = 2”
会发现Foo
实例有一个Bar
实例与barInt
== 1和Bar
实例与barInt
== 2在Foo
实例的barArray
。
你为什么要使用NSPredicate? – erotsppa 2009-09-16 17:44:22
过滤数组。理论上可以应用无限数量的过滤器,并且需要将它们组合在一起,这看起来就像filteredArrayUsingPredicate:方法存在的确切原因。 – 2009-09-16 18:13:51