2010-08-25 9 views
6

Tengo mucha gente NSManagedObjects que necesito filtrar y esperaba hacerlo dentro de la recuperación inicial en lugar de filtrar la matriz después. He selectores se utilizan en predicados antes, pero nunca se deben recuperar NSManagedObjects, por ejemplo, tengo todos mis empleados y yo uso este predicado en la NSArray ...NSPredicar con funciones o selectores

[NSPredicate predicateWithFormat:@"SELF isKindOfClass:%@", [Boss class]] 

... pero ahora quiero hacer un poco más de matemáticas basado en diferentes atributos de mis objetos. Pensé que podía hacer algo así ...

[NSPredicate predicateWithFormat:@"SELF bonusIsAffordable:%f", howMuchMoneyTheCompanyHas]; 

..where bonusIsAffordable: es un método de mi clase Employee y calcularía si puedo permitirse el lujo de pagar una prima. Pero me sale un error ...

Unknown/unsupported comparison predicate operator type cocoa 

¿Alguna idea de lo que estoy jodiendo?

Respuesta

13

Puede ejecutar código arbitrario en un NSPredicate sólo objetos cuando la calificación en la memoria. En el caso de un NSPersistentStore respaldado por SQLite, el NSPredicate se compila en SQL y se ejecuta en el motor de consulta de SQLite. Dado que SQLite no tiene ningún conocimiento de Objective-C, ni se crean instancias de ningún objeto, no hay forma de ejecutar código arbitrario.

Para consultas en memoria (en contra de una colección o un en-memoria o atómica almacén de datos básicos), echar un vistazo a NSExpression, en particular +[NSExpression expressionForFunction:selectorName:arguments:] y +[NSExpression expressionForBlock:arguments:]. Dada dicha expresión, puede crear un NSPredicate programáticamente.

+0

OK, eso tiene sentido. Me preguntaba cómo iba a funcionar el uso de SELF cada vez. Supuse que sacaría cada objeto en la memoria, asumí que estaba mal. – rob5408

0

Su serie de predicados no le dice al objeto predicado qué hacer. El método presumiblemente devuelve un booleano pero el predicado no sabe a qué compararlo. También podría haberle dado una cadena de predicados de "VERDADERO" y esperaba que supiera qué hacer con ella.

Probar:

[NSPredicate predicateWithFormat:@"(SELF bonusIsAffordable:%f)==YES", howMuchMoneyTheCompanyHas]; 
+0

OK, dio un tiro y que tiene 'No se puede analizar la cadena de formato "(AUTO bonusIsAffordable:% f) == SÍ"'. Además, darle una cadena predicada de verdadero funcionaría, al igual que "(SELF bonusIsAffordable:% f) == YES" teóricamente evaluaría a boolean y "SELF isKindOfClass:% @" se evalúa como booleano, ¿no? – rob5408

14

Esto se pone mucho más fácil con Blocks:

NSPredicate *bossPred = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 

    return [evaluatedObject isKindOfClass:[Boss class]]; 
}]; 
+0

¿Qué sucede si necesita hacer esto de forma síncrona? – zakdances

+2

Esto no funciona en iOS con tienda persistente – Krishnan

Cuestiones relacionadas