2010-08-25 6 views
6

J'ai beaucoup de gens NSManagedObjects dont j'ai besoin de filtrer et j'espérais le faire dans le fetch initial au lieu de filtrer le tableau par la suite. J'ai sélecteurs utilisés dans les prédicats avant, mais jamais lors de la récupération NSManagedObjects, par exemple, j'ai tous mes employés, puis-je utiliser ce prédicat sur le NSArray ...NSPrediquer avec des fonctions ou des sélecteurs

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

... mais maintenant je veux faire un peu plus de maths basé sur différents attributs de mes objets. Je pensais que je pouvais faire quelque chose comme ...

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

..where bonusIsAffordable: est une méthode de ma classe d'employés et calculerait si je peux me permettre de les payer une prime. Mais je reçois une erreur ...

Unknown/unsupported comparison predicate operator type cocoa 

Des idées que je suis en train de bousiller?

Répondre

13

Vous pouvez exécuter du code arbitraire dans un NSPredicate seulement lorsque Objets admissibles en mémoire. Dans le cas d'un NSPersistentStore soutenu par SQLite, le NSPredicate est compilé en SQL et exécuté sur le moteur de requête SQLite. Puisque SQLite n'a aucune connaissance d'Objective-C, et qu'aucun objet n'est instancié, il n'y a aucun moyen d'exécuter du code arbitraire.

Pour les requêtes en mémoire (par rapport à une collection ou à un magasin de données Core en mémoire ou atomique), consultez NSExpression, en particulier +[NSExpression expressionForFunction:selectorName:arguments:] et +[NSExpression expressionForBlock:arguments:]. Étant donné une telle expression, vous pouvez créer un NSPredicate par programme.

+0

OK, ça a du sens. Je me demandais comment ça allait se passer avec SELF à chaque fois. J'ai supposé que cela ramènerait chaque objet en mémoire, j'ai supposé faux. – rob5408

0

Votre chaîne de prédicats ne dit pas à l'objet prédicat quoi faire. La méthode renvoie probablement un booléen mais le prédicat ne sait pas à quoi comparer. Vous auriez tout aussi bien pu lui donner une chaîne de prédicats de "VRAI" et vous vous attendiez à savoir quoi en faire.

Essayez:

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

OK, a donné un coup de feu et a obtenu «Impossible d'analyser la chaîne de format "(AUTO bonusIsAffordable:% f) == OUI". En outre, lui donner une chaîne de prédicat de vrai fonctionnerait, tout comme "(SELF bonusIsAffordable:% f) == YES" théoriquement évaluerait à booléen et "SELF isKindOfClass:% @" évalue à booléen, non? – rob5408

14

Cela devient beaucoup plus facile avec Blocks:

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

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

Et si vous avez besoin de faire cela de manière synchrone? – zakdances

+2

Cela ne fonctionne pas dans iOS avec magasin persistant – Krishnan

Questions connexes