模型与视图控制器通信的推荐方式是啥?

Posted

技术标签:

【中文标题】模型与视图控制器通信的推荐方式是啥?【英文标题】:What is the recommended way for a model to communicate with a view controller?模型与视图控制器通信的推荐方式是什么? 【发布时间】:2011-09-04 16:34:32 【问题描述】:

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

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

[我觉得这个问题应该是以前提过的,好像挺常见的,但是搜索了一下,没找到太多]

感谢您的帮助,

【问题讨论】:

你可以在你的模型中添加一个委托并让它指向 VC。 您也可以使用本地通知中心发布通知,然后使用您的 VC 收听这些通知。 我会考虑使用 NSNotificationCenter,谢谢。你的意思是创建我自己的而不是使用默认的(由单例方法 defaultCenter 返回)? 不,只使用默认的通知中心 - 它的意思是使用 :) 谢谢。我想我会使用这个想法。但是,我可能只是直接从视图中听到这些消息,或者在特定场景中任何有意义的消息。 (类似于mindnoise的回答) 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

    代表团 KVO(键值观察) 通知

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

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

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

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

【讨论】:

哇,感谢您提供的信息。老实说,我从未听说过 KVO,但现在我将进一步了解它;这可能正是我所需要的!谢谢。

以上是关于模型与视图控制器通信的推荐方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 为帖子 + 评论数据模型设置视图控制器的最佳实践是啥?

MVC 中的模型到视图通信?

使用视图控制器淘汰嵌套的可观察对象

在表/集合视图控制器及其关联的 diffable 数据源子类之间共享数据模型的好方法是啥?

三层架构是啥?

MVC架构是啥意思?