NSP предикат с функциями или селекторами - PullRequest
6 голосов
/ 25 августа 2010

У меня есть много людей NSManagedObjects, которые мне нужно отфильтровать, и я надеялся сделать это в начальной выборке, а не фильтровать массив впоследствии.Ранее я использовал селекторы в предикатах, но никогда при извлечении NSManagedObjects, например, у меня есть все мои сотрудники, а затем я использую этот предикат в NSArray ...

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

... но теперь я хочусделать немного больше математики на основе различных атрибутов моих объектов.Я думал, что мог бы сделать что-то вроде ...

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

.. где bonusIsAffordable: это метод моего класса Employee, и он рассчитал бы, могу ли я позволить себе выплатить им бонус.Но я получаю сообщение об ошибке ...

Unknown/unsupported comparison predicate operator type cocoa

Есть идеи, что я облажался?

Ответы [ 3 ]

15 голосов
/ 02 апреля 2011

С помощью Blocks :

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

    return [evaluatedObject isKindOfClass:[Boss class]];
}];
это становится намного проще
13 голосов
/ 26 августа 2010

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

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

0 голосов
/ 26 августа 2010

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

Попробуйте:

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