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"]];上記のコードの最初の行の前で呼び出してみてください。

そうしないと、実際には 1 つしか必要ないのに、ループ内の反復ごとに記事の新しいフェッチが生成されます。

この場合、SQLDebug を使用して、生成されている実際の SQL ステートメントを確認すると役立つことがよくあります。これを行うには、実行可能ファイルを右クリックし、[情報を見る] をクリックして、[引数] タブに移動し、[-com.apple.CoreData.SQLDebug 1起動時に渡される引数] を追加します。

于 2010-12-19T17:17:43.617 に答える