6

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

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

【我觉得这个问题之前大概也出现过,好像挺常见的,但是我搜索了一下,没找到太多】

谢谢你的帮助,

4

2 回答 2

7

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

  1. 代表团
  2. KVO(键值观察)
  3. 通知

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

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

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

因此,在您的情况下,委托或 KVO 可能是最佳选择。

于 2011-05-30T09:48:42.813 回答
0

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

于 2011-05-30T09:42:07.257 回答