2010-01-05 2 views
0

J'utilise core-data et j'ai une entité qui a un attribut appelé SID et un autre appelé ParentSID. J'essaye de créer une méthode où je peux passer un objet récupéré de l'ensemble et il retournera la lignée de cet objet en vérifiant le ParentSID de chaque ancêtre.Cocoa iPhone Recursive Array

Si ParentSID est> 0, il doit effectuer une boucle de manière récursive jusqu'à ce qu'il trouve un ancêtre avec le ParentSID de 0. Chaque fois qu'il boucle, il doit ajouter l'ancêtre à un tableau de lignage.

Si le ParentSID est 0 alors c'est fait et devrait renvoyer le tableau de lignage.

Vous ne savez pas si cela a du sens.

Merci, Howie

Répondre

1

sont SID et ParentSID relations ou attributs? La situation que vous décrivez semble plus logique à mettre en œuvre en tant que relation. De cette façon, vous pouvez obtenir l'objet parent en faisant ceci: [object valueForKey:@"parentSID"]. Dans le cas contraire, vous devez faire toute une demande de récupération comme ceci:

NSFetchRequest *parentFetchRequest = [[NSFetchRequest alloc] init]; 
[parentFetchRequest setEntity:[NSEntityDescription entityForName:@"SID" inManagedObjectContext:managedObjectContext]; 
[parentFetchRequest setPredicate:[NSPredicate predicateWithFormat:@"parentSID == %@", [object valueForKey:@"parentSID"]]; 
NSArray *parents = [managedObjectContext executeFetchRequest:parentFetchRequest error:nil]; 
[parentFetchRequest release]; 
if ([parents count] == 0) { 
    // TODO: Handle this error 
    return; 
} 

NSManagedObject *parentSID = [parents lastObject]; 
// Now, at long last, you have a reference to the parent object. 

Pour répondre à votre question, je ne ferais pas cela comme une méthode récursive. Vous pouvez facilement le faire de manière itérative. Par exemple:

NSManagedObject *sid = // get the original object 
NSMutableArray *lineage = [NSMutableArray array]; 
while (sid) { 
    NSMutableObject *parent = // get the parent using one of the techniques above 
    if (parent) 
     [lineage addObject:parent]; 
    sid = parent; 
} 
+0

Merci pour la réponse rapide. SID et SID parent sont des attributs. J'ai une requête d'extraction qui retourne tous les enregistrements. Mon idée était de passer la méthode un objet enfant et de la laisser boucler de manière récursive. chaque fois qu'il boucle, il regarde tous les enregistrements pour trouver le nouveau parent pour l'objet courant. Je vais essayer votre méthode d'utilisation d'une instruction while à la place. merci, Howie – Ward

+0

Il suffit de regarder l'utilisation de la mémoire. Quelle que soit la quantité de données que vous pensez avoir, multipliez-la par 10, car c'est ce que vos utilisateurs vont ajouter à votre application. – Alex

+0

merci pour le pourboire – Ward