将表视图绑定到两个不同数据源的最佳方法是什么?

时间:2015-04-17 09:25:11

标签: cocoa core-data nstableview nsarraycontroller

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

我想要实现的是聚光灯样式结果表,因为用户类型将显示核心数据和远程匹配的即时本地匹配,因为它们来自远程Web服务调用。

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

是否可以继承NSArrayController,我可以以某种方式实现这一目标,还是使用NSTableView.datasource协议并在视图控制器中将它们粘合在一起,这是一种更传统的方法。

1 个答案:

答案 0 :(得分:3)

NSArrayController只是一个便利控制器,可以观察某些数组以进行更改并更新UI(反之亦然)。您真正要问的是"如何创建从Core Data商店以及外部源检索到的组合匹配数组?"。当你这样说时,解决方案变得更加明显。

虽然对于简单的情况很方便,但是一旦你走出去"简单",直接连接到获取请求的NSArrayController就相当愚蠢了。让我们暂时忽略阵列控制器,因为这实际上是两个独立的问题(管理从两个不同的源构建的集合,并使用带阵列的数组控制器或您自己管理而不是表数据源的集合)。

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

对于数组控制器(如果这是你想要的方式),它所做的就是提供一种简单的方法来使用Cocoa Bindings将UI绑定到模型(results数组)通过控制器(本身)。就是这样。它有两种模式:通过针对托管对象上下文执行的获取请求来管理指定类的集合(在这种情况下为NSMutableArray)和来自托管对象模型的实体实例的集合(即& #34;核心数据模式")。由于您的意思是自己管理集合,"核心数据模式"不会为你工作。您希望将其配置为管理可变数组,而不是根本不使用实体/ MOC /获取请求(因为您将自己管理该位)。其中的诀窍是避免"更改阵列控制器后面的数组"并确保通过阵列控制器的方法向/从阵列添加和删除对象,以便它知道阵列的内容已被更改并可以更新/排序等。相应

但是,正如您所怀疑的那样,您也可以完全跳过阵列控制器并使用NSTableViewDataSource协议。这种方法不仅没有任何问题,在处理像你这样的自定义案例时,它在许多方面实际上都是优越的。当然,您必须管理选择更改(通过NSTableViewDelegate协议)以及维护排序,但是当您考虑您对集合的控制级别时,这些是相当简单的事情。您甚至可以轻松管理" group header"您的集合中的标记,并使用适当的委托方法来分隔"本地"来自" Remote"在你的表中使用漂亮的浮动标题行。

我希望这会有所帮助。