0

完了するまでに最大 4 ~ 5 秒かかる fetchRequest があります。入力と同時に検索するソリューションの一部であるため、fetchRequest を中止する方法はありますか?

ユーザーが入力を終了してから 600 ミリ秒後にデータベースの検索を開始するタイマー セットを使用します。そのため、古い検索が完了する前に新しい検索を開始する必要がある可能性があります。

正しいと思われる NSMangedObjectContext のメソッドは見つかりませんでした。古い fetchRequest = nil を設定するだけですか? それともまだ何か裏で動いているのでしょうか?

何か案は?

前もって感謝します!

PS: また、クエリの速度を向上させようとしています。多分誰かもそれについての考えを持っています: https://stackoverflow.com/questions/4695729/query-performance-with-large-database

4

3 に答える 3

1

より良い方法は、フェッチ要求オブジェクトの場所制限です。

  • (void)setFetchLimit:(NSUInteger)limit パラメータ limit レシーバーのフェッチ制限。0 はフェッチ制限なしを指定します。討論

特別な考慮事項 フェッチ制限を設定すると、フレームワークは効率を改善するために最善を尽くしますが、保証はしません。SQL ストアを除くすべてのオブジェクト ストアでは、フェッチ制限を有効にして実行されたフェッチ要求は、単純に無制限のフェッチを実行し、要求されていない行を破棄します。

于 2011-02-11T22:55:12.767 に答える
0

テキスト エントリに UITextField を使用していると仮定すると、fetchRequest ロジックをtextField:shouldChangeCharactersInRange:replacementString:(UITextField) デリゲート メソッドに移動してみませんか?

このメソッドは、ユーザーがテキスト フィールドから文字を入力または削除するたびに呼び出されるため、フェッチ リクエストを開始する前に最小文字数をチェックしたり、テキストを変更する必要があるテキストを変更したりするのに最適な場所です。既存の fetchrequest を nil に設定し、新しいものを開始します。

于 2011-02-11T23:05:09.737 に答える
0

フェッチを実行しているスレッドがほぼ確実に拘束されるため、できるとは思いません。前回このようなことをする必要があったとき、基本的な condvar (NSCondition) を使用してバックグラウンド スレッドを生成し、新しい入力が利用可能になっ-performSelectorOnMainThread:...たことを通知し、出力の準備ができたことを通知しました。これは、新しい「最新」の入力を取得する前に、バックグラウンド スレッドがしばらくの間、古い入力に対して引き続き動作することを意味します。

新しいものを追加する (最新の入力を表す) 前に、キューのすべての操作 (古い入力を表す) をキャンセルすることで、おそらく NSOperation/NSOperationQueue で同様のことができます。

NSMO/NSMOC はスレッドセーフではないため、代わりに一連の (最初のいくつかの) MOID を渡したいと思うでしょう。

于 2011-06-29T02:21:47.737 に答える