2012-04-05 14 views
0

ich habe ein NSPredicade die NSPredicate perfomance, sehr langsam

NSPredicate * Prädikat = [NSPredicate predicateWithFormat wie

aussieht: @ "((strasse.checks ENTHÄLT [cd] YES) und (raumattribute.schalter ENTHÄLT [cd] JA)) ODER ((strasse.standort.ortcheck CONTAINS [cd] JA) UND (raumattribute.schalter CONTAINS [cd] JA)) ODER ((strasse.standort.ortcheck CONTAINS [cd] JA) UND (raumattribute.schalter CONTAINS [cd ] NO) ODER (strasse.checks CONTAINS [cd] JA) UND (raumattribute.schalter CONTAINS [cd] NEIN)) ODER (strasse.standort.ortcheck CONTAINS [cd] NO) "];

Aber die Leistung ist sehr, sehr langsam. Gibt es eine Möglichkeit, es einfacher und schneller zu machen?

+0

Ist gibt es einen besonderen Grund für die Verwendung von String-Attributen anstelle von Integer/Boolean? Was sind die möglichen Werte für 'strasse.checks',' raumattribute.schalter' und 'strasse.standort.ortcheck'? –

+0

strasse.checks, raumattribute.schalter und strasse.standort.ortcheck sind NSSets von bool Werten – Bashud

+0

Womit betreiben Sie das Prädikat? eine Abrufanforderung oder ein Array von Objekten? Woher kommt dieses Array? –

Antwort

0

Erstens können Sie Ihre Prädikat vereinfachen wie folgt aussehen:

NSPredicate *predicate = 
[NSPredicate predicateWithFormat: 
@"(raumattribute.schalter CONTAINS YES OR raumattribute.schalter CONTAINS NO) AND \ 
(strasse.checks CONTAINS YES OR strasse.standort.ortcheck CONTAINS YES) OR \ 
strasse.standort.ortcheck CONTAINS NO"]; 

Wenn wir dann raumattribute.schalter annehmen und strasse.standort.ortcheck enthalten nur Boolesche Werte, können wir das Prädikat wieder vereinfachen:

NSPredicate *predicate = 
[NSPredicate predicateWithFormat: 
@"[email protected] > 0 AND \ 
(strasse.checks CONTAINS YES OR [email protected] > 0) OR \ 
strasse.standort.ortcheck CONTAINS NO"]; 
+0

Wenn ich Ihre erste Vereinfachung versuchen, filtert das Prädikat nichts. Wenn ich versuche, löst der zweite xcode eine Ausnahme aus: nicht unterstützter Funktionsausdruck raumattribute.schalter [SIZE] – Bashud

+0

Ich habe '[SIZE]' durch '@ count' ersetzt. Ich denke, es sollte die Ausnahme lösen. –