2009-09-16 7 views
1

J'ai lu la documentation de NSPredicate et je n'ai pas pu la contourner complètement. Des prédicats simples que je peux comprendre, mais maintenant comment créer un prédicat pour la situation suivante:Est-ce qu'un NSPredicate peut rechercher un objet dans un tableau appartenant à un objet dans un autre tableau?

J'ai un tableau d'objets Foo. Dans la classe Foo, l'un des iVars est un objet NSMutableArray d'objets Bar. J'ai besoin de filtrer le tableau des objets Foo pour obtenir ceux qui ont un objet Bar particulier dans son tableau. Comment?

De même, est-il plus facile (ou possible) de trouver plusieurs objets Bar à la fois, ou de combiner plusieurs prédicats qui chaque recherche pour une barre particulière?

+0

Pourquoi voulez-vous utiliser NSPredicate? – erotsppa

+0

Pour filtrer un tableau. Il y a théoriquement un nombre infini de filtres qui peuvent être appliqués, et ils doivent être combinés ensemble, et cela semble être la raison exacte pour laquelle la méthode filteredArrayUsingPredicate: existe. –

Répondre

3

J'ai trouvé ce que je cherche:

@class Foo { 
    int var1; 
    NSArray *barObjs; 
} 

predicate = @"var1 == 5 AND ANY barObjs.id == 5"; 
3

Votre question peut être divisée en deux questions, et je vais essayer d'y répondre dans l'ordre.

  1. Vous pouvez définir un prédicat sur Foo cas qui est vrai que lorsque le tableau de l'instance de Bar objets contient une instance Bar correspondant à un prédicat distinct. Ce que vous voulez est une expression [SUBQUERY][1]. Une chaîne sous-jacente comme ceci correspondrait Foo cas d'une valeur fooInt 10 et avec une instance Bar dans la propriété barArray qui a une valeur barInt de 1:

    @ "fooInt == 10 & & sous-requête (barArray, $ x , $ x.barInt == 1). @ count> 0 "

    Le format général d'une expression SUBQUERY est SUBQUERY(collection, $var, predicate). Une expression SUBQUERY renvoie une collection d'objets dans collection qui correspondent predicate, donc en prenant c'est @count vous dira si l'instance Foo a une instance Bar qui correspond au prédicat de sous-requête.

  2. Vous pouvez avoir un prédicat arbitrairement complexe au sein de l'expression SUBQUERY (y compris les expressions imbriquées SUBQUERY). Étant donné que les prédicats contenant des expressions de sous-requête sont généralement coûteux à effectuer (ils correspondent à peu près à un SQL JOIN), il est probablement préférable de rechercher plusieurs Bar cas dans une expression SUBQUERY à l'aide OR puis test pour la @count appropriée dans le résultat de la SUBQUERY. Une chaîne sous-jacente comme

    @ "fooInt == 10 & & sous-requête (barArray, $ x, x.barInt $ == 1 || $ x.barInt == 2). @ Count> = 2"

    trouverait Foo instances qui ont une instance Bar avec barInt == 1 et une instance Bar avec barInt == 2 dans l'instance Foo de l'instance barArray.

Questions connexes