1

そのため、filterPredicate にアタッチされたバインディングを介して NSArrayController に直接接続された NSSearchField を取得しました。これにより、ユーザーはコードなしで NSSearchField を入力し、インターフェースで提示された NSArrayController 内のオブジェクトのリストをフィルタリングすることができます。 (具体的には NSCollectionView)。

NSSearchField はライブ検索を提供するために接続されているため、NSCollectionView は、ユーザーが入力を停止するのを少し待った後ではなく、ユーザーが入力するとすぐにフィルター処理されます。

ただし、問題は、これによりインターフェイスが非常に遅くなることです。入力は 0.5 ~ 1 秒と大幅に遅れ、ユーザーが入力する検索文字列の各部分について、NSCollectionView がアイテムの再配置をすべてアニメーション化しようとしているように見えます。

私が望むのは、検索がライブであることですが、検索フィールドへの入力は流動的であり、結果はできるだけ速くフィルタリングされることです。バインディングを介してこれを行う方法はありますか、または別のスレッドで filterPredicate をトリガーするカスタム コードを挿入する必要がありますか?

(NSArrayController にカスタムの並べ替えアルゴリズムを設定していることに注意してください。それを削除すると、遅延が少し解消されるようですが、完全ではありません。)

4

2 に答える 2

0

私は間違いなく別のスレッドの述語を使用します。やるべきことは分かっているようです。明らかに、現在のスレッドでのブロックはラグの問題です。

于 2010-05-30T21:42:12.783 に答える
0

実は、setFilterPredicate: を別のスレッドから呼び出すことはできないようです。クラッシュの原因になります。

私の問題は実際には、フィルター述語を設定するときに遅いコードが何度も呼び出され、フィルタリングのパフォーマンスが大幅に低下したことが原因であることが判明しました。これは、アプリの Instruments で Time Profiler ツールを使用して見つけました。これにより、どのメソッドが最も時間がかかっているかがわかり、そのメソッドを最適化することで遅延の問題が修正されました。

于 2010-08-11T00:04:59.260 に答える