NSPredicate с несколькими условиями

Я пытаюсь создать NSPredicate с несколькими условиями. Я нашел несколько решений, но никто из них, похоже, не работает с моим методом. Самый лучший из них я нашел ниже.

Это мой единственный предикатный метод, и он отлично работает:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", 
searchText];
filteredBusinesses = [businesses filteredArrayUsingPredicate:predicate];

Вот моя отредактированная версия с несколькими условиями. Я не уверен, что происходит не так. Любые идеи?

NSPredicate *p1 = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"businessArea contains[c] %@", 
searchText];

NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[p1, p2]];
filteredBusinesses = [businesses filteredArrayUsingPredicate:predicate];

Ответ 1

Вы можете попробовать это

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[p1, p2]];

Ответ 2

Дополнение к ответу @Nikunj, вы также можете использовать NSCompoundPredicate для ваших операций AND, как это.

Obj-C - AND

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"X == 1"];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"X == 2"];
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicate1, predicate2]];

Swift - И

let predicate1:NSPredicate = NSPredicate(format: "X == 1")
let predicate2:NSPredicate = NSPredicate(format: "Y == 2")
let predicate:NSPredicate  = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1,predicate2] )

Swift 3 - AND

    let predicate1 = NSPredicate(format: "X == 1")
    let predicate2 = NSPredicate(format: "Y == 2")
    let predicateCompound = NSCompoundPredicate.init(type: .and, subpredicates: [predicate1,predicate2])

Ответ 3

В коде, который вы опубликовали, ничего не выглядит неправильно, что означает, что ошибка, вероятно, возникает, когда вы оцениваете предикат, фильтруя массив.

Поскольку первый предикат работает, проблема кроется в ключевом пути businessArea.

Фильтрация массива приведет к исключению, если:

  • Есть объект в массиве, который не имеет значения businessArea (как, впрочем, это не объект, который имеет метод -businessArea)
  • Объект имеет значение businessArea, но значение не является ни NSString, ни nil