NSPredicate功能或选择器

rob*_*408 6 iphone cocoa core-data objective-c nspredicate

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

[NSPredicate predicateWithFormat:@"SELF isKindOfClass:%@", [Boss class]]
Run Code Online (Sandbox Code Playgroud)

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

[NSPredicate predicateWithFormat:@"SELF bonusIsAffordable:%f", howMuchMoneyTheCompanyHas];
Run Code Online (Sandbox Code Playgroud)

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

Unknown/unsupported comparison predicate operator type cocoa
Run Code Online (Sandbox Code Playgroud)

我搞砸了什么想法?

小智 15

使用Blocks可以更轻松地完成:

NSPredicate *bossPred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

    return [evaluatedObject isKindOfClass:[Boss class]];
}];
Run Code Online (Sandbox Code Playgroud)

  • 这在带有持久存储的iOS中不起作用 (3认同)

Bar*_*ark 13

只有在内存中限定对象时,才能在NSPredicate中执行任意代码.在SQLite支持的情况下NSPersistentStore,将NSPredicate编译为SQL并在SQLite查询引擎上执行.由于SQLite没有Objective-C的知识,也没有实例化任何对象,因此无法执行任意代码.

对于内存中查询(针对集合或内存或原子核心数据存储),请查看NSExpression,特别是+[NSExpression expressionForFunction:selectorName:arguments:]+[NSExpression expressionForBlock:arguments:].有了这样的表达式,您可以以NSPredicate编程方式构建.