我是Mac编程的新手,我正在研究基于文档的应用程序.
我的NSDocument子类创建了一个NSWindowController子类.该窗口控制器也创建了两个NSViewController子类.
有时,NSViewController的其中一个视图的更改需要通知NSDocument和/或主模型类.此外,需要将模型的更改通知给每个/一些视图.
我的问题是:什么是最好的方法,以便没有(或最小)耦合?我知道有几种选择,但我不确定哪种选择最适合我的应用程序,因为我不是编程的新手,而是Cocoa,尤其是NSDocument:
> KVO.看起来不错,易于实现,但我不喜欢没有明确通知观察者有关更改的想法(AFAIK,self.someProperty = newValue会自动通知观察者),并且不喜欢你的事实必须注册可能会及时更改的财产名称.
>通知.我知道它们是什么,我已经将它们用于iOS.但我在某处读过,他们不能保证立即发送给观察员.这是真的吗?如果没有,您认为它们是基于文档的应用程序的好方法吗?
>代表们.是的,在正常情况下(或我经常看到的),一个班级有一名代表.但是创建一个代理数组也是可行的(只是测试它).我在这里看到的问题是每次我需要通知代理时我必须遍历它们,确保它们响应方法,并调用该方法.
我还缺少其他任何替代方案吗?
最佳答案 控制器类的KVO是在模型和视图之间进行耦合的最常用方法.实际上,Cocoa Bindings主要用于消除控制器层中的代码,它们基于KVO.确实,KVO / KVC依赖于属性名称,如果这些更改,您将不得不更改连接视图的绑定或KVO设置.但是,通常不可能使您的视图完全不知道底层模型细节,所以我不认为这是一个问题.
我的建议是尽可能使用Cocoa Binding,因为它们消除了大量的胶水代码.在无法使用它们的地方,您的控制器(MVC中的中间层)应使用KVO来观察模型更改并更新相应的视图.视图中的更改可以通过属性访问器和/或控制器的KVC传递回模型.