Вы можете использовать блочный предикат вместо:
NSPredicate *p = [NSPredicate predicateWithBlock:BOOL ^(id evaluatedObject, NSDictionary *bindings) {
return [((NSDictionary *)evaluatedObject)["@project_code"] hasPrefix:@"N8"];
}];
Блок предикаты похожи на нормальные предикаты, за исключением того, вместо оценки строки предиката в отношении каждого объекта, это просто вызывает пользовательский блок, который вы предоставляете, передавая его объект, который сейчас тестируется, и вы возвращаете YES
, если объект соответствует вашим правилам, и NO
в противном случае. Это дает вам гораздо большую гибкость, поскольку вы можете запускать любой код в своем блоке и не ограничиваться условиями в стиле SQL.
Вышеприведенный код создает предикат для фильтрации массива словарей, каждый из которых имеет ключ project_code
(если ключ не существует, метод будет возвращать нуль, поэтому проверка будет ложной, что именно то, что вы хотите в любом случае).
Можете ли вы изменить свою модель данных для хранения пустых строк вместо nil для студентов, у которых нет кода проекта? Это устранит проблему, поскольку все будет строкой. – Greg
@PartiallyFinite фактически данные возвращаются с сервера. Следовательно, это невозможно. И здесь json напрямую преобразуется в словарь с использованием универсального класса. –
Поскольку вы фактически не используете базу данных любого типа, вместо этого вы можете использовать предикат блока - производительность будет не медленнее, и вы получите полную мощность реального кода. – Greg