1

所以我有一个 NSSearchField 通过绑定直接连接到一个 NSArrayController,附加到 filterPredicate,因此无需任何代码,用户只需输入 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 回答