1

Web サービス呼び出しからの膨大な量のデータを処理するアプリを開発する必要があります。

検索バー付きの UITableView があります。ユーザーが文字を入力するたびに、テーブルビューは検索バーのテキストに対応する検索結果を動的に表示する必要があります。

この種のデータ転送を処理する最善の方法は何ですか? ユーザーが文字を入力するたびにリクエストを送信するのは、悪い考えのようです。

4

4 に答える 4

3

適切なアプローチは、検索によってフィルター処理されたデータのみを使用してテーブルを再読み込みすることです。

  1. あなたはNSArrayあなたの価値観を持っています
  2. 次にNSArray、フィルタリングされた結果用に別のものを作成します
  3. 次に、次のように最初の配列を調べます。

    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];
        }
    }
    
  4. arrayOfResults次に、代わりにテーブルをリロードしますarrayOfAll

于 2012-02-01T12:46:30.477 に答える
2

はい、ユーザーが文字を入力するたびにリクエストを送信するのは悪い考えです...しかし、たとえば NSOperationQueues を使用して実装する場合、キーがタップされたときに以前のリクエストをキャンセルできます (任意の文字またはバックスペース)。 1 つのリクエストがサーバーに送られます。これは単なる提案であり、とにかく実装する際には十分に検討してください。

明らかに最も簡単な方法は、Prashant の言うとおりです。

@tonio私が理解しているように、NSArrayにすべてのデータが既にあると想定しており、NSRangeで解析する結果をフィルタリングするだけです。Karthik が言ったように、これは Web サービスからの膨大な量のデータであり、ロードに多くの時間がかかる可能性があり、不要なネットワーク トラフィックです。しかし、これがあなたがやりたい方法だとしましょう。NSPredicate を使用して結果をフィルタリングすることをお勧めします。

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF contains[cd] %@",searchText];
NSArray *filteredResults = [arrayOfAll filteredArrayUsingPredicate: predicate];

次に、TableView でfilteredResults 配列を使用します。

于 2012-02-01T13:24:55.190 に答える
0

それは、「巨大」がどれだけ大きいか、およびユーザーがアプリをどのように使用するかによって異なります。

データセット全体をロードするのに数分かかる場合は、検索文字列が変更されるたびに、少量のデータピースミールを取得する傾向があります。

データがそれほど「巨大」ではない場合、Prashant Bhayani が提案したような「検索」ボタンが必要ない場合は、tonio.mg の提案を使用してください (彼はおそらくモバイル デバイスの私見に最適なソリューションです)。

重要なことは、この機能をどのように実装するかではなく、エンドユーザーがこの機能をどのように機能させたいかということです。通常、ユーザーは (巨大なデータ セットを) 待ちたくはありませんが、すばやく簡単に最新のデータ アクセス (遅延読み込み) を望んでいます。

于 2012-02-01T13:50:07.263 に答える
0

文字ごとに検索するのではなく、ユーザーが「検索」ボタンをタップしたときに検索します。

于 2012-02-01T12:44:44.127 に答える