2014-09-03 5 views
11

Ich versuche, ein NSPredate mit mehreren Bedingungen zu erstellen. Ich habe mehrere Lösungen gefunden, aber keine von ihnen scheint mit meiner Methode zu arbeiten. Der am besten aussehende, den ich gefunden habe, ist unten.NSPredicate mit mehreren Bedingungen

Das ist mein einziges Prädikat Methode, und es funktioniert gut:

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

Hier meine bearbeitete Version mit mehreren Bedingungen ist. Ich bin mir nicht sicher, was falsch läuft. Irgendwelche Ideen?

+0

Was erwarten Sie und was sind bekommst du? – bhargavg

+0

Ich habe erwartet, dass ich mehrere Arten von Informationen in mein Suchfeld eingeben kann. Stattdessen stürzt es ab :( – Brandon

+1

paste your stacktrace – bhargavg

Antwort

12

Sie können diese

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

genagelt es !!! Vielen Dank! – Brandon

+0

... ein 'oder' Prädikat ist nicht das gleiche wie ein 'und' Prädikat. –

1

In dem von Ihnen geposteten Code sieht nichts falsch aus, was bedeutet, dass der Fehler wahrscheinlich von Ihnen kommt, wenn Sie das Prädikat durch Filtern des Arrays auswerten.

Da das erste Prädikat funktioniert, liegt das Problem bei businessArea Schlüsselpfad.

Filtern die Array würde eine Ausnahme auslösen, wenn:

  1. Es gibt ein Objekt in dem Array, das keinen businessArea Wert hat (wie in, es ist nicht ein Objekt, das eine -businessArea Methode hat)
  2. das Objekt hat einen businessArea Wert, aber der Wert ist weder ein NSString noch nil
7

Zusätzlich zu @ Nikunjs Antwort können Sie NSCompoundPredicate auch für Ihre UND-Operationen verwenden.

Obj-C - UND

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

Swift - UND

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

Swift 3 - UND

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