1

我有一个应用程序,我正在实现全文搜索。我有 2 个实体:关键字和文章之间存在多对多关系。有问题的代码是这样的:

            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

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

4

2 回答 2

0

我不是CoreData的专家,但它不是懒惰地加载文章吗?如果是,则意味着对每个关键字的存储执行查询。

于 2010-12-19T17:04:02.637 回答
0

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

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

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

于 2010-12-19T17:17:43.617 回答