模型与视图控制器通信的推荐方式是啥?
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 - 为帖子 + 评论数据模型设置视图控制器的最佳实践是啥?