0

次のコードは、コア データを使用してテーブル ビューに検索バーを実装することに関して、この投稿の受け入れられた回答からのものです。2 つのフェッチ済み結果コントローラー (FRC) を使用します。1 つは「通常の」テーブル ビュー用、もう 1 つは検索結果テーブル ビュー用です。また、ヘルパー メソッドを使用して、テーブル ビュー データ ソース メソッド、FRC デリゲート メソッドなどに使用する FRC を決定します。  

次の部分を除いて、ほとんどのコードを理解しています。コメントを置き換えるには、どのコードを入力すればよい"update the filter..."ですか? また、self.searchFetchedResultsController とそのデリゲートを nil に設定する必要があるのはなぜですか?

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSInteger)scope
{
    // update the filter, in this case just blow away the FRC and let lazy evaluation create another with the relevant search info
    self.searchFetchedResultsController.delegate = nil;
    self.searchFetchedResultsController = nil;
    ...
}
4

2 に答える 2

1

fetchedResultsControllerを nilに設定すると、次のようになります。次にテーブル ビュー (または検索結果テーブル ビュー) がデータを必要とするdatasourceとき、(存在しない) FRC を参照するクエリが実行されます。メソッドを調べるfetchedResultsControllerと、FRC が遅延して作成されていることがわかりますnil。初期化ルーチンでは、フェッチ要求が実行され、新しい結果がデータ ソースで使用できるようになります。

これは非常に確実に機能しますが、FRC を完全に破壊しないという議論があります。これは冗長であり、より多くの時間、CPU、およびバッテリー電力を必要とします。を呼び出すだけで、まったく同じ効果が得られます。

[fetchedResultsController performFetch:nil]; 

これで、データ ソースにも最新のデータが利用できるようになります。

編集

コメントで述べたように、fetchedResultsControllerメソッドを実際に変更して遅延作成する必要があります。ガイダンスについては、Apple テンプレートを参照してください。

if (_fetchedResultsController != nil) {
   return _fetchedResultsController;
}
// continue creating a new one
于 2012-09-23T14:43:57.500 に答える
0

受け入れられた回答のコードを簡単に読みました。多くは単なる骨組みであり、実装するメソッドを示しています。filterContentForSearchText:scope:とはいえ、メソッドで「FRCを吹き飛ばす」というアプローチを実装したことはありません。しかし、製品コードに検索バー機能を備えた NSFetchedResultsController に基づくテーブル ビューがあります。

filterContentForSearchText:scopeそのうちの 1 つからの例を次に示します。

- (void)filterContentForSearchText:(NSString *)searchText scope:(NSString *)scope;
{
    /*  clear the filtered list */
    [_mutableFilteredLadders removeAllObjects];

    /*  in background queue filter our list */
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSPredicate *ladderTitlePredicate = [NSPredicate predicateWithFormat:@"title CONTAINS[cd] %@",searchText];
        NSPredicate *ladderTextPredicate = [NSPredicate predicateWithFormat:@"ANY ladderItems.text CONTAINS[cd] %@",searchText];
        NSPredicate *searchPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:ARRAY(ladderTextPredicate,ladderTitlePredicate)];

        [_mutableFilteredLadders addObjectsFromArray:[[self allLadders] filteredArrayUsingPredicate:searchPredicate]];

        /* reload table on the main queue */
        dispatch_async(dispatch_get_main_queue(), ^{
            [[[self searchDisplayController] searchResultsTableView] reloadData];
        });
    });
}
于 2012-09-23T11:33:31.477 に答える