2009-12-18 107 views

回答

94

这里的经验法则是有多少客户希望得到一个事件的通知。如果它主要是一个对象(例如,关闭一个视图或按下按钮单击,或对一个失败的下载作出反应),那么你应该使用委托模型。

如果您发出的事件可能一次对多个对象感兴趣(例如屏幕旋转,内存使用情况,用户登录/注销),则应使用NSNotificationCenter

+25

我还想补充一点,通知是单向的(例如'DidFireMissle'),而如果需要返回信息(例如' - (BOOL)shouldFireMissle')则需要委托。 – benzado 2009-12-31 08:28:35

+7

@benzado:其实,你可以传递一个对象和一个消息,哪些接收者可以改变。您需要记住多个(或零个)接收者可能会处理通知,但它是有效的。 – 2012-07-15 03:31:27

34

它们的目的是不同的:

  • 通知用于广播消息从发送者到可能的几个接收者未知。

  • 委派用于将邮件发送给代表发件人的单个已知收件人。

7

考虑到性能是一个好主意(对于少量的通知对象,更好的通知中心更适合更大数量的对象,还是运行一个分析器),但我认为更重要的因素,因为你在谈论Objective-C并且不太可能讨论可能用C语言编写的代码库中真正高性能的部分,这会减少模块之间的编译时间依赖性。

没有什么能阻止你拥有一组代表而不是一个代表。

我只能使用NSNotificationCenter来查看我制作的任何网络堆栈组件的状态以及任何自定义设备状态监视接口。但对大多数耦合而言,与应用程序的全局状态无关,我认为在大多数情况下使用Objective-C中的普通接口协议更为明确,而且更容易让后面的人们使用NSNotificationCenter。事实上,我从来没有使用过NotificationCenter来处理我自己的自定义事件,并且倾向于使用代表来帮助别人阅读我的代码,从而方便代码的理解。

最后,当然,通过标准API的通知,您没有选择,并且必须使用苹果禁止给定事件的两种方法中的任何一种。

11

通知通常会更好地通知UI在其他线程上发生的更改。苹果公司的文档强烈建议尽可能跨线程使用代理,以保持稳定性和性能。在Mac上,他们建议使用Bindings,但由于它们不在iPhone上,所以通知可能是您的下一个最佳选择。

3

这两者之间的选项是使用观察者模式,没有NSNotificationCenter。看看我的Objective-C实现here

6

通知更适合解耦UI组件。它允许您在控制器或模型中插入任何视图而无需进行任何修改。对于松散耦合设计来说绝对更好。

但是对于授权和通知之间的表现,您需要考虑通话的频率。

对于更频繁的事件,委派可能会更好,对于不太常见的事件,通知更好,但接收者更多。这是项目选择什么。