Запаздывающий интерфейс с NSSearchField, подключенным к NSArrayController через привязки

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

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

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

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

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


person Simone Manganelli    schedule 30.05.2010    source источник


Ответы (2)


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

person aaa    schedule 30.05.2010

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

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

person Simone Manganelli    schedule 11.08.2010