2

私は解決を延期しているこの問題を抱えていましたが、今がその時です。

私は基本的な辞書プログラムを持っています。UISearchBarとUITableViewがあります。デバイスで実行している場合を除いて、キーボードラグが発生する場合を除いて、正常に動作します。(もちろん、シミュレーターは問題ありません)私には2種類の検索があります。入力時および返品時。どちらも結果を返すのにほぼ同じ時間がかかることがわかりましたが、As-you-typeを使用するとキーボードが遅れます。

searchTextを取得してすべてのsqliteリフティングを実行する検索メソッドに送信するUISearchBartextDidChangeがあり、結果を配列に入れます。テーブルをリロードします。

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    if((searchType == SEARCH_AS_YOU_TYPE) && ([searchText length] >= 2)){
        NSString *myKeyword = [NSString stringWithFormat:@"%@", searchText];
        [self search:myKeyword];
        [myTableView reloadData];
    }
}

結果を50に制限します。SQLクエリはLIKEとORを使用しますが、それを回避する方法はまだありません。

SELECT WORD_ID, DEFIN, PINYIN, SIMP, TRAD from WORDS where DEFIN LIKE "%to dog %" OR DEFIN LIKE "%dog" OR DEFIN LIKE "%dog%"  ORDER BY DEFIN LIMIT 50

また、キーボードが少なくとも遅れないことを期待して、[myTableViewreloadData]を検索メソッドに移動してみました。喜びはありません。そして悲しいことに、sqliteがlike演算子を使用する場合、基本的にすべての行をチェックしていることを私は知っています。しかし、80行の場合は3〜4秒は少し遅いようです。

どんな考え、アイデア、コメントまたは提案も大歓迎です!

4

5 に答える 5

8

同じスレッドでキーボードを検索して準備しているように思えます。このようにして、文字数だけ検索し、入力速度は検索速度に制限されます。

適切な解決策は、これを2つのスレッドに分割することです。1つはキーボードを読み取って表示するためのもので、もう1つは検索結果を検索して表示するためのものです。このように、検索よりも速く入力している場合は、検索のみが遅れますが、入力は遅れません。たとえば、Firefoxのアドレスバーはそのように機能します。

2つのスレッドと、2つのスレッド間の通信/調整により、コードはより複雑になりますが、これが唯一の優れたソリューションだと思います。

于 2009-05-04T11:05:15.993 に答える
3

SQLiteがそのクエリを実行すると私が推測している方法は次のとおりです。

  1. LIKEステートメントの1つに一致するすべての行を検索します。

  2. それらをDEFINでソートします。

  3. 最初の50行の後で結果を切り捨てます。

本当に辛いのはそのような部分だと思います。それがなければ、見つかった最初の50個の一致する行を単純に収集できます。定義をソートしないで逃げることができますか?

于 2009-05-04T10:58:18.413 に答える
1

LIKE を使用しているため、sqlite はインデックスを使用せず、結果セットで 50 レコードの制限に達するまで、最初から順番にスキャンします。データの順序によっては、最悪の場合、最初または最後に最初の 50 件の結果にヒットする可能性があります。

犬などの定義済みの各基本単語の最初の文字を格納する新しい列を作成し、この列にインデックスを付けてみませんか。

select * from words where fisrtletter = :firstletter order by defin limit 50 にクエリを変更します

これにより、検索スペースが大幅に削減されます

完全一致には like 演算子を使用します

order by が不要になるようにデータを事前に並べ替えることもできます。order by を使用すると、最初の 50 レコードがヒットしたときに終了するのではなく、テーブル全体がスキャンされると思われます。

于 2009-05-06T05:31:52.223 に答える
0

別のスレッドで検索クエリを作成してみてください。UI 操作はメイン スレッドでのみ実行されるため、メイン スレッドで実行される時間のかかる操作は UI 操作を遅らせます。

于 2009-05-04T12:17:19.330 に答える
0

私は一般的に使用します

[self performSelectorInBackground:@selector(threadedFetch) withObject:nil];

Core Data と組み合わせてNSFetchedResultsController、ユーザーの検索入力時にフェッチを開始します。でも踏む時は気をつけて。NSManagedObjectContextスレッドごとに個別に使用するか、でロックする単一のコンテキストを使用します-[NSManagedObjectContext lock]

于 2010-05-04T17:50:03.843 に答える