Медленный интерфейс с NSSearchField, подключенный к NSArrayController через привязки - PullRequest
1 голос
/ 31 мая 2010

Итак, у меня есть NSSearchField, подключенный напрямую к NSArrayController через привязки, привязанные к filterPredicate, так что без какого-либо кода пользователь может просто ввести NSSearchField и отфильтровать список объектов в представленном ему NSArrayController. в интерфейсе (NSCollectionView, если быть точным).

NSSearchField подключен для обеспечения оперативного поиска, так что NSCollectionView фильтруется мгновенно по мере ввода пользователем, а не после ожидания в течение короткого периода времени для прекращения ввода пользователем.

Однако проблема в том, что это делает интерфейс действительно медленным. Набор текста значительно задерживается, на 0,5-1 секунды, и кажется, что NSCollectionView пытается анимировать каждую и каждую перестановку элементов для каждой части строки поиска, которую вводит пользователь.

Мне бы хотелось, чтобы поиск был активным, а ввод текста в поле поиска - плавным, а результаты - фильтрацией как можно быстрее. Есть ли способ сделать это с помощью привязок, или мне нужно будет вставить какой-то специальный код, который запускает filterPredicate в отдельном потоке?

(Обратите внимание, что у меня есть настраиваемый алгоритм сортировки, настроенный на NSArrayController, и удаление его, похоже, немного помогает с задержкой, но не полностью.)

Ответы [ 2 ]

0 голосов
/ 11 августа 2010

На самом деле, похоже, что вы не можете вызвать setFilterPredicate: из отдельного потока. Это вызывает сбой.

Оказывается, моя проблема на самом деле была вызвана некоторым медленным кодом, вызываемым снова и снова при установке предиката фильтра, что сильно замедляло производительность фильтрации. Я нашел это с помощью инструмента Time Profiler в разделе «Инструменты» в моем приложении. Это показало мне, какой метод занимал больше всего времени, и оптимизация этого метода устранила проблему с задержкой.

0 голосов
/ 31 мая 2010

Я бы определенно использовал предикат в отдельном потоке. Кажется, ты знаешь, что должен делать. Очевидно, что блокировка в текущем потоке является проблемой задержки.

...