2010-04-15 12 views
6

Basta chiedersi quale sia il modo migliore per creare un NSPredicate se alcuni filtri sono facoltativi?Creazione di un filtro NSP per un filtro

questo è fondamentalmente per un filtro, quindi se alcune opzioni non sono selezionate non mi a filtrare per loro

ad es. Se ho l'opzione 1 e l'opzione 2 sono impostate per il filtro.

NSPredicate * predicato = [NSPredicate predicateWithFormat: @ "opzione1 =% @ E opzione2 =% @] ....

altrimenti se solo opzione1 NSPredicate * predicato = [NSPredicate predicateWithFormat: @" opzione1 =% @] ....

L'essere chiave ci sono 10 diverse opzioni per filtrare, quindi non voglio avere a codice per il 10x10 combinazioni possibili.

Grazie

risposta

17

John, date un'occhiata a costruire e conservare il " sub-predicati" come modelli e quindi utilizzare il rami di logica per costruire un predicato composto per eseguire il filtraggio

/* 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 

Si potrebbe desiderare di utilizzare un dizionario per mantenere il set di modelli predicato curato e organizzato, ma l'esempio precedente mostra i passaggi di base.

Rob.

Non
+0

Si può sviluppare più sulla vostra idea di come mantenere i modelli predicato in una variabile statica? –

1

predicateWithFormat: prende un NSString. Quindi tutto ciò che dovete fare è costruire la stringa in base alle opzioni selezionate (usando un ciclo per aggiungere a NSMutableString, ecc.) E passarla a predicateWithFormat:

+1

sicuro questo è totalmente vero Questo funziona: [fetchRequest setPredicate: [NSPredicate predicateWithFormat: @ "startTime> =% @", da]]; Questo arresta: [fetchRequest setPredicate: [predicato NSPredicateWithFormat: [NSString stringWithFormat: @ "startTime> =% @", da]]]; – John

+0

Giovanni: Ecco perché si è aggiunto 'stringWithFormat:'. Non farlo. Fai quello che Diederik ha suggerito invece (o usare 'componentsJoinedByString:', che fa il loop per voi). –

Problemi correlati