2011-12-09 9 views
3

AppleからTableSearchのサンプルコードを見ていました。彼らはすべてのコンテンツのためのNSArrayとフィルタリングされたコンテンツのためのNSMutableArrayを持っているようです。フィルタがオンの場合、NSMutableArrayが表示されます。オフの場合、すべてのデータを持つNSArrayが表示されます。UITableViewのコンテンツをフィルタリングする

1)フィルタリングの一般的な実装であるかどうかは、前にあまりフィルタリングをしていないので、私は疑問に思っていました。

2)この質問に追加するには、4つの異なるカテゴリのフィルタがある場合、フィルタがオンのときにフィルタリングされたコンテンツを示す1つのNSMutableArrayを使用しますか?または、フィルタの種類ごとに4つの異なるNSMutableArraysを作成し、どのフィルタがオンになっているかに応じてそのリストを表示します。

一般的な実装ではリスト用のNSArrayがあると仮定すると、フィルタリングされたリストの配列を作成すると、4つの異なるNSMutableArraysを実行すると高価になります。どのフィルタオプションを選択するのか、NSMutableArrayをオンザフライで作成してからリロードする必要があります。[tableView reloadData];

ありがとうございました。

答えて

2

私の前にサンプルアプリケーションはありませんが、通常は述語を使用してフィルタリングするので、docs on NSPredicateを確認すると便利です。

したがって、フィルタを変更するには、述語を変更します。フィルタリングされた結果をすべて作成する必要はありません。任意の瞬間に必要なものだけを作成します。

アレイでは、shown in this exampleのようなコードを使用してフィルタリングできます。キーラインは

NSPredicate *predicate; 
predicate = [NSPredicate predicateWithFormat:@"length == 9"]; 
NSArray *myArray2 = [myArray filteredArrayUsingPredicate:predicate]; 

です。フィルタリングは必ずしも配列で行われるわけではありません。コアデータを使用している場合はNSFetchedResultsControllersで実行できます。述語も同様に、同じように使用されます。述語は、正規表現のフィルタリングなど、他のものにも使用できます。あなたがそれに精通していなければ、それを見る価値があります。

1

本当に依存しています。基礎となるデータがコアデータにある場合は、NSFetchedResultsControllerを使用し、NSPredicateを指定します。データの配列がある場合は、それをトラバースして別のデータ配列を作成するのが最も簡単です。

一般に、フィルタ自体は、全体的な描画プロセス(テーブルセルのインスタンス化またはリサイクルを含む)ほど高価ではありません。インストゥルメントを使用すると、簡単で簡単な操作ができます。

4つの異なる配列を保持することは、通常、希少なリソースであるメモリの観点からは好ましくありません。

どのような場合でも、reloadDataが関与します。 (OSのバージョンによっては、NSFetchedResultsControllerドキュメントを参照してください)

関連する問題