NSArray
iPhoneでインタラクティブなオートコンプリートを行うために大きな(19kアイテム)をフィルタリングすると、パフォーマンスの問題が発生します。
現在、ユーザーが検索ボックスに文字を入力するたびにNSPredicate
、別のスレッドでを使用して配列のフィルタリングを開始し、結果を表示します。もちろん、ユーザーが2番目のキーをタブで押す前にiPhoneがフィルタリングを完了するにはデータセットが大きいため、ユーザーが1〜2秒間入力を停止するまで、プレビューは表示されません。
[Computer Science Babble、この部分はスキップしても問題ありません]フレームワークが行っているのは、配列内のすべてのアイテムにNSPredicateを適用することです。したがって、O(n)が必要です。nは配列アイテムの数です。ただし、より効率的なアプローチを使用して、O(log(n))で問題をより解決できるはずです。つまり、リストをO(n * log(n))で1回ソートし(これは開発時に実行できます)、そのリストO(log(n))のどこに検索文字列を挿入する必要があるかを調べ、アイテムが検索文字列O(m)で始まらないまでそこにあります。m << nアルゴリズムを使用して、効率的なO(log(n)+ m)が得られます。DAWGの方がさらに良いでしょうが、ツールキットでそのようなものを見たのを覚えていません。[/ Computer Science Babble]
配列に通知する組み込みの方法がある場合、フィルターがテストしているのとまったく同じフィールドで並べ替えられるため、並べ替えられた配列にフィルターを効率的に適用できるのではないかと思いました。
解決
個々の文字を、その文字で始まるキーを持つアイテムの配列にマップする辞書を使用して、非常に単純な検索インデックスを作成しました。少なくとも私のユースケースでは、これは瞬時の表示オートコンプリートを実現するのに十分な最適化でした。