NSPredicate with functions or selectors

后端 未结 3 1089
抹茶落季
抹茶落季 2020-12-19 08:37

I have a lot of people NSManagedObjects that I need filtering and was hoping to do it within the initial fetch instead of filtering the array afterwards. I\'ve used selector

相关标签:
3条回答
  • 2020-12-19 08:50

    Your predicate string doesn't tell the predicate object what to do. The method presumably returns a boolean but the predicate doesn't know what to compare that to. You might as well have given it a predicate string of "TRUE" and expected it to know what to do with it.

    Try:

    [NSPredicate predicateWithFormat:@"(SELF bonusIsAffordable:%f)==YES", howMuchMoneyTheCompanyHas];
    
    0 讨论(0)
  • 2020-12-19 08:59

    You can execute arbitrary code in an NSPredicate only when qualifying objects in memory. In the case of a SQLite-backed NSPersistentStore, the NSPredicate is compiled to SQL and executed on the SQLite query engine. Since SQLite has no knowlege of Objective-C, nor are any objects instantiated, there's no way to execute arbitrary code.

    For in-memory queries (against a collection or an in-memory or atomic Core Data store), have a look at NSExpression, particular +[NSExpression expressionForFunction:selectorName:arguments:] and +[NSExpression expressionForBlock:arguments:]. Given such an expression, you can build an NSPredicate programatically.

    0 讨论(0)
  • 2020-12-19 09:01

    This gets a whole lot easier with Blocks:

    NSPredicate *bossPred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    
        return [evaluatedObject isKindOfClass:[Boss class]];
    }];
    
    0 讨论(0)
提交回复
热议问题