【问题标题】:NSPredicate with functions or selectors带有函数或选择器的 NSPredicate
【发布时间】:2011-04-03 22:34:52
【问题描述】:

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

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

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

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

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

Unknown/unsupported comparison predicate operator type cocoa

知道我在搞砸什么吗?

【问题讨论】:

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


    【解决方案1】:

    使用Blocks,这变得容易多了:

    NSPredicate *bossPred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    
        return [evaluatedObject isKindOfClass:[Boss class]];
    }];
    

    【讨论】:

    • 如果您需要同步执行此操作怎么办?
    【解决方案2】:

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

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

    【讨论】:

    • 好的,这是有道理的。我想知道每次如何使用 SELF。我以为它会将每个对象都拉入内存,但我猜错了。
    【解决方案3】:

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

    试试:

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

    【讨论】:

    • 好的,试一试,得到'无法解析格式字符串“(SELF bonusIsAffordable:%f)==YES”'。此外,给它一个谓词字符串 true 会起作用,就像 "(SELF bonusIsAffordable:%f)==YES" 理论上会评估为布尔值,而 "SELF isKindOfClass:%@" 评估为布尔值,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多