Цикл через отношения CoreData ManagedObject - PullRequest
1 голос
/ 28 ноября 2011

У меня есть ситуация, когда у меня есть список ObjectA.ObjectA имеет отношение многие ко многим с ObjectB.Мне нужно перебрать список ObjectA и сохранить все имена ссылок ObjectB.

То, как я сейчас это делаю, указывает на фактический цикл for, который составляет 89,5% времени выполнения.с помощью инструментов:

for (ObjectA *a in listA) {
        [names removeAllObjects];
        for (ObjectB *b in a.objectBs) { //This is 89.5% of the execution time
            [names addObject:b.name];
        }
}

Как можно справиться с этим лучше?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Я немного смущен вашей петлей. Единственными результатами, которые в итоге получатся в names, будут b.name с самых последних a.objectBs в listA.

Как насчет того, чтобы попробовать что-то вроде:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"objectB"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.objectAs contains %@", listA); 
fetchRequest.predicate = predicate;

// execute

Это вернуло бы все objectBs, которые имеют objectA в их objectA отношении. Затем вы можете позвонить objectB.name в том месте, где вам нужно имя.

PS Название вашего примера делает это в 50 миллионов раз труднее для подражания.

0 голосов
/ 29 ноября 2011

Это не тот ответ, который вы просите, но, возможно, он решит вашу проблему. Зачем вам эти имена?

Не могли бы вы использовать предикат для циклического перебора вложенных списков? Я не знаю, будет ли производительность лучше, но, поскольку вы используете CoreData, я бы попробовал.

Я использовал предикат, который перебирает вложенные списки, подобные этому. Я сделал это с помощью редактора предикатов Xcode3. Но у Xcode4 есть и редактор.

    NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ANY keywords.word contains[cd] %@",  self.searchBar.text];

    [fetchedResultsControllerSearch.fetchRequest setPredicate:predicate];



NSError *error = nil;
if (![[self fetchedResultsControllerSearch] performFetch:&error]) {
    // Handle error
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    exit(-1);  // Fail
}      
...