2010-04-15 19 views
6

Solo me pregunto cual es la mejor manera de construir un NSPredicate si algunos filtros son opcionales?Creando un NSPredicate para un filtro

Esto es, básicamente, para un filtro, por lo que si no se seleccionan algunas opciones no me va a filtrar los

por ejemplo. Si tengo la opción 1 y la opción 2 configuradas para el filtro.

NSPredicate * predicado = [NSPredicate predicateWithFormat: @ "option1 =% @ Y opcion2 =% @] ....

de lo contrario si solo OPCION1 NSPredicate * predicado = [NSPredicate predicateWithFormat: @" = option1% @] ....

La clave es que hay 10 opciones diferentes para filtrar, por lo que no quiero tener que codificar las posibles combinaciones de 10x10.

Gracias

Respuesta

17

John, eche un vistazo a la construcción y retención del " sub-predicados" como plantillas y luego utilizar sus ramas lógicas para construir un predicado compuesto de realizar el filtrado

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

Es posible que desee utilizar un diccionario para mantener el conjunto de plantillas de predicados agradables y organizados, pero el ejemplo anterior muestra los pasos básicos.

Rob.

No
+0

¿Puede desarrollar más sobre su idea de cómo mantener las plantillas de predicados en una variable estática? –

1

predicateWithFormat: toma un NSString. Así que todo lo que tiene que hacer es construir la cadena en función de las opciones seleccionadas (utilizando un for-loop para agregar a un NSMutableString, etc.) y pasarlo a predicateWithFormat:

+1

seguro que eso es totalmente cierto Esto funciona: [fetchRequest setPredicate: [NSPredicate predicateWithFormat: @ "horaInicio> =% @", desde]]; Esto se bloquea: [fetchRequest setPredicate: [NSPredicate predicateWithFormat: [NSString stringWithFormat: @ "startTime> =% @", from]]]; – John

+0

John: Eso es porque ha agregado 'stringWithFormat:'. No hagas eso. Haga lo que sugirió Diederik en su lugar (o use 'componentsJoinedByString:', que hace el ciclo por usted). –