我的情况是ObjectA
列表。 ObjectA
与ObjectB
有多对多的关系。我需要遍历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];
}
}
有哪些方法可以更好地处理这个问题?
答案 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万次难以理解。