NSPredicate with Multiple Conditions

Addition to @Nikunj's answer, you can also use NSCompoundPredicate for your AND operations like this.

Obj-C - AND

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

Swift - AND

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])

NSCompoundPredicate received a facelift. Just in case someone's looking for a Swift 5+ version:

AND

let predicatesAND = NSCompoundPredicate(andPredicateWithSubpredicates:[pred1,pred2])

OR

let predicatesOR = NSCompoundPredicate(orPredicateWithSubpredicates:[pred1,pred2])

You can try this

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

Nothing looks wrong in the code you posted, which means the error is probably coming from when you evaluate the predicate by filtering the array.

Since the first predicate works, the problem lies with the businessArea key path.

Filtering the array would throw an exception if:

  1. There's an object in the array that doesn't have a businessArea value (as in, it's not an object that has a -businessArea method)
  2. The object does have a businessArea value, but the value is neither an NSString nor nil