我有很多人需要过滤的NSManagedObjects,并且希望在初始获取中执行此操作,而不是之后过滤数组。我以前在谓词中使用了选择器,但从来没有在获取NSManagedObjects时,例如我拥有所有员工,然后我在NSArray上使用这个谓词......
[NSPredicate predicateWithFormat:@"SELF isKindOfClass:%@", [Boss class]]
...但现在我想根据对象的不同属性做更多的数学运算。我以为我可以做点像......
[NSPredicate predicateWithFormat:@"SELF bonusIsAffordable:%f", howMuchMoneyTheCompanyHas];
..其中bonusIsAffordable:是我的员工类的一种方法,并会计算我是否有能力向他们支付奖金。但我得到一个错误......
Unknown/unsupported comparison predicate operator type cocoa
我有什么想法搞砸了?
答案 0 :(得分:15)
使用Blocks:
可以轻松实现这一目标NSPredicate *bossPred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
return [evaluatedObject isKindOfClass:[Boss class]];
}];
答案 1 :(得分:13)
在内存中限定对象时,您可以在NSPredicate 中执行任意代码。对于SQLite支持的NSPersistentStore
,NSPredicate
被编译为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];