NSPredicate with functions or selectors

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 selectors in predicates before, but never when fetching NSManagedObjects, for example I have all my employees and then i use this predicate on the NSArray...

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

...but now I want to do a bit more math based on different attributes of my objects. I thought I could do something like...

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

..where bonusIsAffordable: is a method of my Employee class and would calculate whether I can afford to pay them a bonus. But I get an error...

Unknown/unsupported comparison predicate operator type cocoa

Any ideas what I'm screwing up?

6
задан rob5408 25 August 2010 в 19:58
поделиться

2 ответа

Вы можете выполнить произвольный код в NSPredicate только при квалификации объектов в памяти. В случае NSPersistentStore с поддержкой SQLite NSPredicate компилируется в SQL и выполняется в механизме запросов SQLite. Поскольку SQLite не знает Objective-C и не создает экземпляры каких-либо объектов, нет возможности выполнить произвольный код.

Для запросов в памяти (к коллекции, хранящемуся в памяти или атомарному хранилищу Core Data) смотрите NSExpression, в частности +[NSExpression expressionForFunction:selectorName:arguments:] и +[NSExpression выражениеForBlock:аргументы:]. Имея такое выражение, вы можете построить NSPredicate программно.

13
ответ дан 8 December 2019 в 03:51
поделиться

Ваша строка предиката не указывает объекту предиката, что делать. Метод предположительно возвращает логическое значение, но предикат не знает, с чем его сравнивать. С таким же успехом вы могли бы дать ему строку предиката «ИСТИНА» и ожидать, что он знает, что с ней делать.

Попробуйте:

[NSPredicate predicateWithFormat:@"(SELF bonusIsAffordable:%f)==YES", howMuchMoneyTheCompanyHas];
-1
ответ дан 8 December 2019 в 03:51
поделиться