1

我有一个情况,我有一个ObjectA的列表。 ObjectAObjectB有多对多的关系。我需要遍历ObjectA的列表并存储ObjectB引用的所有名称。通过CoreData ManagedObject的关系循环

我目前做这点实际的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]; 
     } 
} 

有什么办法来处理这更好的?

回答

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 
}  
0

我对你的循环有点困惑。结果在names的唯一结果将是最后a.objectBslistA中的b.name

如何尝试喜欢的东西:

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

// execute 

这将返回所有在他们objectA关系的objectAobjectBs的。您可以在需要该名称的位置致电objectB.name

PS你的例子的命名使得这5000万次更难以遵循。