Какао iPhone рекурсивный массив - PullRequest
0 голосов
/ 05 января 2010

Я использую данные ядра, и у меня есть объект, у которого есть атрибут с именем SID, а другой - с именем ParentSID.

Я пытаюсь создать метод, в котором я могу передать извлеченный объект из набора, и он вернет происхождение этого объекта, проверив ParentSID каждого предка.

Если ParentSID равен> 0, он должен рекурсивно зацикливаться, пока не найдет предка с ParentSID, равным 0. Каждый раз, когда он зацикливается, он должен добавить предка в массив lineage.

Если ParentSID равен 0, то это сделано и должно вернуть массив lineage.

Не уверен, имеет ли это смысл.

Спасибо, Howie

1 Ответ

1 голос
/ 05 января 2010

Являются ли SID и ParentSID отношениями или атрибутами? Ситуация, которую вы описываете, звучит так, как будто имеет смысл реализовать отношения. Таким образом, вы можете получить родительский объект, выполнив это: [object valueForKey:@"parentSID"]. В противном случае вам потребуется выполнить целый запрос на выборку, например:

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.

Чтобы ответить на ваш конкретный вопрос, я бы не стал делать это как рекурсивный метод. Вы можете легко сделать это итеративно. Например:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...