我已经阅读了NSPredicate文档,但无法完全绕过它。我能理解的简单谓词,但现在如何为以下情况创建谓词:
我有一个Foo对象数组。在Foo类中,其中一个iVars是Bar对象的NSMutableArray。我需要过滤Foo对象的数组,以获得在其数组中具有特定Bar对象的对象。怎么样?
此外,是否更容易(或可能)一次找到多个Bar对象,或者组合多个谓词来搜索特定的Bar?
答案 0 :(得分:3)
您的问题可以分为两个问题,我会尝试按顺序回答。
您可以在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表达式的一般格式为SUBQUERY
。 collection
表达式返回predicate
中与@count
匹配的对象集合,因此将其Foo
告诉您Bar
实例是否有{{1}与子查询谓词匹配的实例。
您可以在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";