繁体   English   中英

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

[英]Avoiding coupling in a document-based Cocoa app?

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

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

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

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

  • KVO。 看起来不错并且易于实现,但是我不喜欢不明确通知观察者有关更改的想法(AFAIK, self.someProperty = newValue会自动通知观察者),并且不喜欢您这样的事实必须注册可能会随时间变化的属性名称。

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

  • 代表们 是的,在正常情况下(或我通常看到的情况),一个类只有一个委托。 但是创建一组委托也可以(只是对其进行了测试)。 我在这里看到的问题是,每次我需要通知代表时,我都必须遍历它们,确保他们响应一个方法,然后调用该方法。

我还有其他选择吗?

控制器类的KVO是在模型及其视图之间进行耦合的最常见方法。 实际上,可可绑定旨在基于KVO来消除控制器层中的代码。 确实,KVO / KVC依赖于属性名称,并且如果属性名称发生更改,则必须更改连接视图的绑定或KVO设置。 但是,使您的视图完全不了解底层模型的细节通常是不可行的,因此我认为这不是问题。

我的建议是尽可能使用Cocoa Binding,因为它们消除了很多胶合代码。 在无法使用它们的地方,您的控制器(MVC中的中间层)应使用KVO观察模型更改并更新适当的视图。 可以通过控制器通过属性访问器和/或KVC将视图中的更改传递回模型。

是的,在正常情况下(或我通常看到的情况),一个类只有一个委托。 但是创建一组委托也可以(只是对其进行了测试)。

委托通常用于修改委托对象的行为。 应用程序委托就是一个很好的例子:NSApplication本身不是很有趣。 它依靠其委托来定义应用程序的有趣行为。 如果多个代表彼此冲突,则让多个代表都尝试修改单个对象的行为可能会成为问题。 如果代表不同意该怎么办?

在Cocoa中有些情况下,一个类使用多个委托,但是每个委托都有单独的角色。 例如,NSTableView同时具有委托和数据源,但两者实际上都是某种委托。

我在这里看到的问题是,每次我需要通知代表时,我都必须遍历它们,确保他们响应一个方法,然后调用该方法。

这并不难解决。 例如,您可以创建一个NSInvocation来封装该调用,然后将调用发送给每个“代理”。 但是,如果这样做,您将几乎重新设计了通知系统。 如果您需要多名代表提案中的一对多沟通,那么使用通知或KVO可能会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM