Web サービス呼び出しからの膨大な量のデータを処理するアプリを開発する必要があります。
検索バー付きの UITableView があります。ユーザーが文字を入力するたびに、テーブルビューは検索バーのテキストに対応する検索結果を動的に表示する必要があります。
この種のデータ転送を処理する最善の方法は何ですか? ユーザーが文字を入力するたびにリクエストを送信するのは、悪い考えのようです。
Web サービス呼び出しからの膨大な量のデータを処理するアプリを開発する必要があります。
検索バー付きの UITableView があります。ユーザーが文字を入力するたびに、テーブルビューは検索バーのテキストに対応する検索結果を動的に表示する必要があります。
この種のデータ転送を処理する最善の方法は何ですか? ユーザーが文字を入力するたびにリクエストを送信するのは、悪い考えのようです。
適切なアプローチは、検索によってフィルター処理されたデータのみを使用してテーブルを再読み込みすることです。
NSArray
あなたの価値観を持っていますNSArray
、フィルタリングされた結果用に別のものを作成します次に、次のように最初の配列を調べます。
for (int i = 0; i < [arrayOfAll count]; i++){
NSString *sTemp = [arrayOfAll objectAtIndex:i];
NSRange titleResultsRange = [sTemp rangeOfString:searchText
options:NSCaseInsensitiveSearch];
if (titleResultsRange.length > 0){
[arrayOfResults addObject:sTemp];
}
}
arrayOfResults
次に、代わりにテーブルをリロードしますarrayOfAll
はい、ユーザーが文字を入力するたびにリクエストを送信するのは悪い考えです...しかし、たとえば NSOperationQueues を使用して実装する場合、キーがタップされたときに以前のリクエストをキャンセルできます (任意の文字またはバックスペース)。 1 つのリクエストがサーバーに送られます。これは単なる提案であり、とにかく実装する際には十分に検討してください。
明らかに最も簡単な方法は、Prashant の言うとおりです。
@tonio私が理解しているように、NSArrayにすべてのデータが既にあると想定しており、NSRangeで解析する結果をフィルタリングするだけです。Karthik が言ったように、これは Web サービスからの膨大な量のデータであり、ロードに多くの時間がかかる可能性があり、不要なネットワーク トラフィックです。しかし、これがあなたがやりたい方法だとしましょう。NSPredicate を使用して結果をフィルタリングすることをお勧めします。
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF contains[cd] %@",searchText];
NSArray *filteredResults = [arrayOfAll filteredArrayUsingPredicate: predicate];
次に、TableView でfilteredResults 配列を使用します。
それは、「巨大」がどれだけ大きいか、およびユーザーがアプリをどのように使用するかによって異なります。
データセット全体をロードするのに数分かかる場合は、検索文字列が変更されるたびに、少量のデータピースミールを取得する傾向があります。
データがそれほど「巨大」ではない場合、Prashant Bhayani が提案したような「検索」ボタンが必要ない場合は、tonio.mg の提案を使用してください (彼はおそらくモバイル デバイスの私見に最適なソリューションです)。
重要なことは、この機能をどのように実装するかではなく、エンドユーザーがこの機能をどのように機能させたいかということです。通常、ユーザーは (巨大なデータ セットを) 待ちたくはありませんが、すばやく簡単に最新のデータ アクセス (遅延読み込み) を望んでいます。
文字ごとに検索するのではなく、ユーザーが「検索」ボタンをタップしたときに検索します。