2010-04-15 5 views
6

Vous vous demandez simplement quel est le meilleur moyen de construire un NSPredicate si certains filtres sont optionnels?Construction d'un NSPredicate pour un filtre

Ceci est essentiellement un filtre, donc si certaines options ne sont pas sélectionnées je ne pas filtrer en les

par exemple. Si j'ai l'option1 et l'option2 définies pour le filtre.

NSPredicate * prédicat = [NSPredicate predicateWithFormat: @ "= option1% @ ET option2 =% @] ....

autrement si juste OPTION1 NSPredicate * prédicat = [NSPredicate predicateWithFormat: @" =% option1 @] ....

La clé étant qu'il y a 10 options différentes à filtrer, donc je ne veux pas avoir à coder pour les combinaisons possibles 10x10.

Merci

Répondre

17

John, jetez un oeil à la construction et à la conservation de la " sous-prédicats » en tant que modèles puis utilisez vos branches logiques pour construire un prédicat composé pour effectuer le filtrage

/* Retain these predicate templates as properties or static variables */ 
NSPredicate *optionOneTemplate = [NSPredicate predicateWithFormat:@"option1 = $OPTVALUE"]; 
// .. and so on for other options 

NSMutableArray *subPredicates = [NSMutableArray arrayWithCapacity:10]; 

/* add to subPredicates by substituting the current filter value in for the placeholder */ 
if (!!optionOneValue) { 
    [subPredicates addObject:[optionOneTemplate predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:optionOneValue forKey:@"OPTVALUE"]]]; 
} 
// .. and so on for other option values 

/* use the compound predicate to combine them */ 
NSPredicate *filterPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates]; 

// Now use your filterPredicate 

Vous pouvez utiliser un dictionnaire pour garder l'ensemble des modèles sous-jacentes agréable et organisé, mais l'exemple ci-dessus montre les étapes de base.

Rob.

+0

Pouvez-vous développer plus sur votre idée de la façon de garder les modèles de prédicat dans une variable statique? –

1

predicateWithFormat: prend une NSString. Donc tout ce que vous avez à faire est de construire la chaîne en fonction des options sélectionnées (en utilisant une boucle pour ajouter à un NSMutableString, etc.) et le passer à predicateWithFormat:

+1

ne suis pas sûr des thats totalement vrai Cela fonctionne: [fetchRequest setPredicate: [NSPredicate predicateWithFormat: @ "startTime> =% @", à partir de]]; Cette erreur se produit: [fetchRequest setPredicate: [NSPredicate predicateWithFormat: [NSString stringWithFormat: @ "startTime> =% @", à partir de]]]; – John

+0

John: C'est parce que vous avez ajouté 'stringWithFormat:'. Ne fais pas ça. Faites ce que Diederik a suggéré à la place (ou utilisez 'componentsJoinedByString:', qui fait la boucle pour vous). –

Questions connexes