将 NSTableView 绑定到两个不同数据源的最佳方法?

Best way to bind a NSTableView to two different datasources?

假设我有一个 NSTableView,它当前正在使用从 Core Data 中提取数据的 NSArrayController。从两个不同的数据源流行 table 视图的最佳方式是什么,一个是本地核心数据,第二个是远程 web 服务调用。

我想要实现的是 Spotlight 风格的结果 table,当用户输入时,它会显示来自核心数据的即时本地匹配以及来自远程 Web 服务调用的远程匹配。

我是 Cocoa 的新手,来自 iOS 背景,所以 NSArrayControllers 对我来说是新手。

是否可以对 NSArrayController 进行子类化,我能否以某种方式实现这一点,或者是否有更传统的方法仅使用 NSTableView.datasource 协议并将它们粘合在一个视图控制器中。

一个NSArrayController只是一个方便的控制器,它观察一些数组的变化并更新UI(或vice-versa)。您真正要问的是 "how do I create a combined array of matches retrieved from a Core Data store as well as external sources?"。当你这样说时,解决方案变得更加明显。

虽然对于简单的情况很方便,但一旦您走出 "simple",直接连接到获取请求的 NSArrayController 就相当愚蠢了。让我们暂时忽略阵列控制器,因为这实际上是两个不同的问题(管理从两个不同来源构建的 collection,以及将阵列控制器与阵列一起使用或设置您自己管理与 table数据源)。

假设您在某个名为 results 的控制器上有一个 属性 作为 NSMutableArray。要构建您的结果,您将结合两个操作:1) 自己创建和执行 NSFetchRequest,以及 2) 创建和执行一些网络操作。我不打算详细介绍这两个操作中的任何一个,因为有很多关于这些方法的有价值的信息来源,但它真的很简单,只要将两组结果合并到您的 results数组。

至于数组控制器(如果这是你想要的方式),它所做的只是提供一种简单的方法来使用 Cocoa 绑定将你的 UI 绑定到你的模型(results 数组)通过控制器(本身)。就是这样。它有两种模式:管理指定 class 的 collection(在本例中为 NSMutableArray)和来自托管 Object 的实体实例的 collection模型,通过针对托管 Object 上下文(即 "Core Data mode")执行的获取请求。由于您打算自己管理 collection,因此 "Core Data mode" 对您不起作用。您希望将其配置为管理一个 mutable 数组并且根本不使用实体/MOC/获取请求(因为您将自己管理那部分)。诀窍是避免 "changing the array behind the array controller's back" 并确保通过数组控制器的方法 添加和删除 objects to/from 数组 所以它知道数组的内容已更改,可以相应地更新/排序/等。

但是,正如您所怀疑的,您也可以完全跳过阵列控制器,只使用 NSTableViewDataSource 协议。这种方法不仅没有任何问题,而且在处理像您这样的自定义案例时,它实际上在很多方面都更胜一筹。当然,您必须管理选择更改(通过 NSTableViewDelegate 协议)以及维护排序,但是当您考虑对 collection 的控制级别时,这些都是相当微不足道的事情.您甚至可以轻松管理 collection 中的 "group header" 标记,并使用适当的委托方法使用漂亮的浮动 [=52] 将 "Local" 与 table 中的 "Remote" 分开=]行。

希望对您有所帮助。