循环通过核心数据管理对象关系

时间:2011-11-28 19:53:40

标签: objective-c optimization core-data foreach entity-relationship

我的情况是ObjectA列表。 ObjectAObjectB有多对多的关系。我需要遍历ObjectA列表并存储ObjectB引用的所有名称。

我目前正在这样做的方式指向实际for循环使用Instruments的执行时间为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 :(得分:0)

这不是你要求的答案,但也许它可以解决你的问题。你为什么需要这些名字?

你不能使用谓词循环嵌套列表吗?我不知道性能是否更好,但是当你使用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
}      

答案 1 :(得分:0)

我对你的循环感到有点困惑。 names结尾的唯一结果是b.name中最后一个a.objectBs的{​​{1}}。

尝试类似的事情:

listA

这将返回NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"objectB"]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.objectAs contains %@", listA); fetchRequest.predicate = predicate; // execute objectBs关系中objectA的所有objectA。然后,您可以在需要名称时调用objectB.name

PS你的例子的命名使这5000万次难以理解。