为什么这段代码这么慢? (CoreData& NSSet)

时间:2010-12-19 16:04:05

标签: iphone core-data ios4 nsset

我有一个应用程序,我正在实施全文搜索。我有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

错误在哪里,我该怎样做才能加快速度?

2 个答案:

答案 0 :(得分:0)

我不是CoreData的专家,但不是懒得加载文章吗?如果是,则表示针对每个关键字针对商店执行查询。

答案 1 :(得分:0)

尝试在上面代码的第一行之前调用[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"article"]];

否则,循环中的每次迭代都会为文章生成新的提取,尽管您确实只需要一个。

在这种情况下,使用SQLDebug查看生成的实际SQL语句通常很有帮助。 要执行此操作,请右键单击您的可执行文件,单击“获取信息”,转到“参数”选项卡,然后在“要在启动时传递的参数”中添加-com.apple.CoreData.SQLDebug 1