2009-09-16 89 views
1

我已经阅读了NSPredicate文档,无法将我的头一直包裹在它的周围。我可以理解的简单谓词,但是现在如何为以下情况创建一个谓词:NSPredicate可以搜索另一个数组中的对象拥有的数组中的对象吗?

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

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

+0

你为什么要使用NSPredicate? – erotsppa 2009-09-16 17:44:22

+0

过滤数组。理论上可以应用无限数量的过滤器,并且需要将它们组合在一起,这看起来就像filteredArrayUsingPredicate:方法存在的确切原因。 – 2009-09-16 18:13:51

回答

3

我已经找到了我要找:

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

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

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

  1. 您可以定义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表达式返回匹配predicatecollection中的对象集合,因此如果Foo实例具有与子查询谓词相匹配的Bar实例,则会采用它@count

  2. 您可以在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

相关问题