NSPredicate功能或选择器

时间:2010-08-25 19:58:05

标签: iphone objective-c cocoa core-data nspredicate

我有很多人需要过滤的NSManagedObjects,并且希望在初始获取中执行此操作,而不是之后过滤数组。我以前在谓词中使用了选择器,但从来没有在获取NSManagedObjects时,例如我拥有所有员工,然后我在NSArray上使用这个谓词......

[NSPredicate predicateWithFormat:@"SELF isKindOfClass:%@", [Boss class]]

...但现在我想根据对象的不同属性做更多的数学运算。我以为我可以做点像......

[NSPredicate predicateWithFormat:@"SELF bonusIsAffordable:%f", howMuchMoneyTheCompanyHas];

..其中bonusIsAffordable:是我的员工类的一种方法,并会计算我是否有能力向他们支付奖金。但我得到一个错误......

Unknown/unsupported comparison predicate operator type cocoa

我有什么想法搞砸了?

3 个答案:

答案 0 :(得分:15)

使用Blocks

可以轻松实现这一目标
NSPredicate *bossPred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

    return [evaluatedObject isKindOfClass:[Boss class]];
}];

答案 1 :(得分:13)

在内存中限定对象时,您可以在NSPredicate 中执行任意代码。对于SQLite支持的NSPersistentStoreNSPredicate被编译为SQL并在SQLite查询引擎上执行。由于SQLite没有Objective-C的知识,也没有实例化任何对象,因此无法执行任意代码。

对于内存中查询(针对集合或内存或原子Core Data存储),请查看NSExpression,特别是+[NSExpression expressionForFunction:selectorName:arguments:]+[NSExpression expressionForBlock:arguments:]。给定这样的表达式,您可以以编程方式构建NSPredicate

答案 2 :(得分:0)

您的谓词字符串不会告诉谓词对象要做什么。该方法可能会返回一个布尔值,但谓词不知道要将其与之比较。您也可以给它一个谓词字符串“TRUE”,并期望它知道如何处理它。

尝试:

[NSPredicate predicateWithFormat:@"(SELF bonusIsAffordable:%f)==YES", howMuchMoneyTheCompanyHas];