所以我有一个NSSearchField通过绑定直接连接到NSArrayController,附加到filterPredicate,因此没有任何代码,用户只需键入NSSearchField并过滤提供给他的NSArrayController中的对象列表在接口(NSCollectionView,具体)。
连接NSSearchField以提供实时搜索,以便在用户输入时立即过滤NSCollectionView,而不是等待用户停止输入的短暂时间。
然而,问题是这使得界面真的很滞后。打字显着延迟0.5-1秒,似乎NSCollectionView试图为用户输入的搜索字符串的每个部分设置项目的每个重新排列动画。
我想要的是搜索生效,但在搜索字段中输入是流畅的,并且结果要尽可能快地过滤。有没有办法通过绑定来做到这一点,还是我需要在一个单独的线程中放入一些触发filterPredicate的自定义代码?
(请注意,我在NSArrayController上设置了自定义排序算法,删除它似乎对滞后性有所帮助,但并不完全。)
答案 0 :(得分:0)
我肯定会在单独的线程上使用谓词。看来你知道你要做什么。显然阻塞当前线程是滞后问题。
答案 1 :(得分:0)
实际上,看起来你不能从一个单独的线程调用setFilterPredicate:它会导致崩溃。
事实证明,我的问题实际上是由于在设置过滤器谓词时反复调用一些慢速代码引起的,这严重降低了过滤的性能。我在我的应用程序中使用Instruments中的Time Profiler工具找到了这个。这向我展示了哪种方法花费的时间最多,并且优化该方法可以解决滞后问题。