避免在基于文档的Cocoa应用程序中进行耦合?

时间:2012-01-18 15:27:47

标签: objective-c macos cocoa cocoa-design-patterns

我是Mac编程的新手,我正在开发基于文档的应用程序。

我的NSDocument子类创建了一个NSWindowController子类。该窗口控制器也创建了两个 NSViewController 子类。

有时,NSViewController的其中一个视图的更改需要通知NSDocument和/或主模型类。此外,需要将模型中的更改通知给每个/某些视图。

我的问题是:什么是最好的方法,以便没有(或最小)耦合?我知道有几种选择,但我不确定哪种选择最适合我的应用,因为我不是编程的新手,而是Cocoa,特别是NSDocument

  • KVO。看起来不错,易于实施,但我不喜欢不明确通知观察者有关变更的想法(AFAIK,{{1自动通知观察者),并且不喜欢你必须注册可能随时间变化的属性名称这一事实。

  • 通知。我知道它们是什么,我已经将它们用于iOS。但是我在某个地方读过他们不能保证会立即发送给观察员。这是真的吗?如果没有,您认为它们是基于文档的应用程序的好方法吗?

  • 代表。是的,在正常情况下(或我经常看到的),一个班级有一名代表。但是创建一个代理数组也是可行的(只是测试它)。我在这里看到的问题是每次我需要通知代表时我必须遍历它们,确保它们响应方法,然后调用该方法。

我还缺少其他替代方案吗?

1 个答案:

答案 0 :(得分:1)

  

是的,在正常情况下(或我经常看到的),一个班级有   一位代表。但是创建一个代表数组也是可行的(只是   测试了它。)

委托通常用于修改委托对象的行为。应用程序委托就是一个很好的例子:NSApplication本身并不是很有趣;它依赖于它的委托来定义应用程序的有趣行为。如果各个代理彼此冲突,那么多个代理都试图修改单个对象的行为可能是一个问题。如果代表不同意,你会怎么做?

在Cocoa中有一些案例,其中一个类使用多个委托,但每个委托都有一个单独的角色。例如,NSTableView既有委托又有数据源,但两者都是一种类型的委托。

  

我在这里看到的问题是,每次我需要通知   代表我必须循环使用它们,确保它们响应a   方法,并调用该方法。

这并不难解决。例如,您可以创建一个NSInvocation来封装调用,然后将调用发送到每个“委托”。但是,如果你这样做,你几乎会彻底改造通知系统。如果您需要通过多个代表提案进行的一对多通信,那么您最好使用通知或KVO。