8

約2000個のエンティティを返すフェッチ要求を実行しています。現在、これは私のデバイスでは約20秒かかります。そのため、フェッチ制限を100に設定し、ユーザーがテーブルビューの最後までスクロールしたら、次の100個のエンティティをフェッチすることを考えました。NSFetchRequest's setFetchLimitこれは、とを使用して実行できますsetFetchOffset

しかし、私が理解できないのは、オブジェクト101〜200をフェッチしている2回目のフェッチで、オブジェクト1〜100はどうなるのかということです。NSFetchedResultsController100アイテムごとに個別に使用してから、複数のフェッチ結果コントローラーに基づいてクエリを実行するようにテーブルビューのデータソースメソッドを構成する必要がありますか?または、同じものを使用NSFetchedResultsControllerして一度に100個のエンティティをフェッチすることはできますが、その後のフェッチごとに、元の100個のアイテムに次の100個のアイテムを追加するだけですか?

編集:これが私のコードです:

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"MessageObject" inManagedObjectContext:appDelegate.managedObjectContext];

    [fetchRequest setEntity:entity];
    NSPredicate *predicate= [NSPredicate predicateWithFormat:@"ANY tags.tagName==%@", currentTagObject.tagName];
    [fetchRequest setPredicate:predicate];
    NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:5];
4

2 に答える 2

4

指定したサイズのバッチでフェッチを実行するために、実際には何もする必要はありません。あなたが説明している振る舞いは、単一のコントローラーで単一のフェッチ要求を実行しているだけです-バッチサイズプロパティを設定することで、CoreDataにあなた自身の考慮によって最適なバッチサイズと見なすものを単に示唆しています。CoreDataは、必要に応じて指定されたサイズの順次バッチでオブジェクトのフェッチを処理します。また、メモリ消費に必要な場合は、管理対象オブジェクトに障害を発生させます。

于 2012-06-22T23:23:00.317 に答える
3

ANYの使用は、かなりコストのかかる操作です。関係についてはよくわかりませんが、メッセージオブジェクトエンティティではなく、特定のタグ名のタグエンティティを取得してみてください。次に、逆の関係を使用してメッセージオブジェクトエンティティを取得します

また、あなたのソートはコンパレータを使用していますが、これは問題を解決していないと確信しています。セレクターを使用せずに単純な並べ替えを実行できるように、日付はコアデータによって整数として格納される必要があります。

コアデータは非常に高速です。65,000レコードのキーワード検索を実行し、ミリ秒単位で結果を返しました。

幸運を祈る

于 2012-06-24T00:44:09.113 に答える