我有一个应用程序,我正在实施全文搜索。我有2个enitites:关键字和文章,它们之间有多对多的关系。 有问题的代码就是:
keywordsInRange = [[[CoreDataManager sharedManager] managedObjectContext] executeFetchRequest:request error:&err];
for(Keywords* word in keywordsInRange) {
NSDate *methodStart = [NSDate date];
[mySet addObjectsFromArray:[word.article allObjects]];
NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"Keyword Search Exec Time: %.3f", executionTime);
}
输出是这样的:
Keyword Search Exec Time: 0.235 //added 1 article
Keyword Search Exec Time: 0.216 //added 6 articles
Keyword Search Exec Time: 0.211 //etc
Keyword Search Exec Time: 0.205
Keyword Search Exec Time: 0.204
正如您所看到的,当我在设备上进行测试时(iPad iOS 4.2.1),添加链接到该组中关键字的所有文章会花费很长时间。当我在模拟器中测试时,时间是:
0.029
0.026
0.026
0.026
0.026
错误在哪里,我该怎样做才能加快速度?
答案 0 :(得分:0)
我不是CoreData的专家,但不是懒得加载文章吗?如果是,则表示针对每个关键字针对商店执行查询。
答案 1 :(得分:0)
尝试在上面代码的第一行之前调用[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"article"]];
。
否则,循环中的每次迭代都会为文章生成新的提取,尽管您确实只需要一个。
在这种情况下,使用SQLDebug查看生成的实际SQL语句通常很有帮助。
要执行此操作,请右键单击您的可执行文件,单击“获取信息”,转到“参数”选项卡,然后在“要在启动时传递的参数”中添加-com.apple.CoreData.SQLDebug 1
。