Cocoa touch 模型与视图控制器通信的建议方式是什么?

Cocoa touch 模型与视图控制器通信的建议方式是什么?,cocoa-touch,ios,model-view-controller,loose-coupling,Cocoa Touch,Ios,Model View Controller,Loose Coupling,例如,我有一个模型类,用于处理从其他iPhone接收蓝牙消息。当我收到其中一条消息时,我需要更新视图。我相信标准的方法是通过视图控制器。视图控制器具有对模型和视图的引用,因此可以与每个模型和视图进行通信 但是,他们应该如何将消息发送回VC?它们可以分别引用视图控制器(作为属性,使用assign not retain)。这是一种糟糕的做法吗(如果我没有弄错的话,那是循环引用)? 是否有其他方法可以做到这一点?我考虑过委托模式,但是对于一个简单的问题来说,编写一个完整的委托和所有的工作似乎是相当多的

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

但是,他们应该如何将消息发送回VC?它们可以分别引用视图控制器(作为属性,使用assign not retain)。这是一种糟糕的做法吗(如果我没有弄错的话,那是循环引用)?
是否有其他方法可以做到这一点?我考虑过委托模式,但是对于一个简单的问题来说,编写一个完整的委托和所有的工作似乎是相当多的工作。 或者,如果你认为我想得太多,请告诉我

[我认为这个问题以前可能出现过,它似乎很常见,但我搜索了一些,没有找到多少]


感谢您的帮助,

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

通常,您有3种不同的技术:

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

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

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


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

    您可以将委派添加到模型中,并使其指向VC。您也可以使用本地通知中心发布通知,然后使用VC收听这些通知。我将研究使用NSNotificationCenter,谢谢。你的意思是创建我自己的,而不是使用默认的(由singleton方法defaultCenter返回)?不,只使用默认的notificationcenter-它是用来:)谢谢。我想我会用这个主意。然而,我可能只是直接从视图中听到这些消息,或者在特定场景中听到任何有意义的消息。(类似于mindnoise的回答)哇,谢谢你提供的信息。老实说,我从未听说过KVO,但现在我将进一步了解它;这可能正是我需要的!非常感谢。