模型与视图控制器通信的推荐方法是什么?

时间:2011-05-30 09:24:24

标签: cocoa-touch ios model-view-controller loose-coupling

例如,我有一个模型类,用于处理从其他iPhone接收蓝牙消息。当我收到其中一条消息时,我需要更新视图。我相信这样做的标准方法是通过视图控制器。视图控制器具有对模型和视图的引用,因此可以与它们中的每一个进行通信。

但是他们应该如何将消息发送回VC呢?他们可以每个都有一个对视图控制器的引用(作为属性,赋值不保留)。这是不好的做法(如果我没弄错它是一个循环引用)? 有没有其他方法可以做到这一点?我已经考虑了委托模式,但是要编写一个完整的委托,对于一个简单的问题,所有这些似乎都是很多工作。 或者,如果你认为我正在思考这个问题,请随时告诉我!

[我觉得这个问题可能在之前出现过,看起来很常见,但我搜索了一下并没有发现太多]

感谢您的帮助,

2 个答案:

答案 0 :(得分:7)

一般来说,您有3种不同的技术:

  1. KVO(键值观察)
  2. 通知
  3. 如果您的模型只需要通知一个对象(您的视图控制器)更改,则委派是可行的方法。创建一个新接口,将委托属性添加到模型等可能感觉额外工作,但在灵活性,代码重用,设计等方面绝对值得。委托是Cocoa编程中的标准模式,并且广泛用于Apple的API。

    如果您的模型需要通知多个更改对象,您希望使用KVO或通知。使用KVO,您可以订阅更改模型上特定属性或键的事件。例如,当模型上的“messages”属性发生更改时,可以向任何附加的侦听器通知更改并做出相应的响应。

    当您要将应用程序范围的消息发送给多个侦听器时,将使用通知。标准API的示例是键盘通知(显示/关闭键盘时)和界面方向更改。

    所以在你的情况下,代表团或KVO可能是最好的选择。

答案 1 :(得分:0)

在iOS应用程序中从未这样做过,但在一般的mvc术语中,有时候更好地理解(并保持代码更清晰)直接从模型更新视图是。这在我看来很好,但它将模型与视图结合起来,这很糟糕。因此,要解决此问题,您应该实现观察者(广播 - 接收)设计模式(或使用内置的ios事件广播/接收系统 - > NSNotificationCenter)。这样,当某些事情发生改变模型时,模型将广播一个偶数,无论是否有人收听该事件,它不再是它的问题,因此,你将视图与模型分离。