繁体   English   中英

model 与视图 controller 通信的推荐方式是什么?

[英]What is the recommended way for a model to communicate with a view controller?

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

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

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

谢谢你的帮助,

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

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

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

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

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

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

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

暂无
暂无

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

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