Вы можете использовать predicateWithBlock:
подход, который предложил @lxt, или вы можете использовать FUNCTION
подход. Это позволит вам создать предикат, который выглядит следующим образом:
[NSPredicate predicateWithFormat:@"FUNCTION(SELF, 'mySuperMethod:', %@)", aParameter];
Если вы используете этот предикат для фильтрации массива, то:
SELF
итеративно будет каждым элементом в массиве
- для каждого элемента в массиве будет вызываться
-mySuperMethod:
метод
-mySuperMethod:
получит aParameter
в качестве параметра для метода
-mySuperMethod:
вернет BOOL
, который был упакован в NSNumber
<<, это очень важно </li>
- все объекты, которые возвращают
YES
из -mySuperMethod:
, будут включены в отфильтрованный массив.
Для получения дополнительной информации об этом синтаксисе, прочитайте это сообщение в блоге .
Так почему вы можете использовать этот подход вместо блочного? Я могу думать о двух причинах:
- Обратная совместимость
- Если вам это нужно для работы на Leopard (блоки для Mac были введены в Snow Leopard).
- Если вам это нужно для работы на iOS до 4.0 (блоки для iOS были введены в iOS 4.0).
- Вы хотите сериализовать предикат для архивирования и последующего извлечения. Это нормально, если
aParameter
соответствует протоколу <NSCoding>
. Блоки не могут быть сериализованы.
Однако, если ни одно из этих требований не является обязательным, блочный подход, вероятно, будет лучше в долгосрочной перспективе, поскольку он более очевиден и удобочитаем. :)