NSNotificationCenter和代理模式(使用协议)的区别?

70
每个技术都有什么优缺点?
我应该在哪些情况下使用它们?
6个回答

105

这里的经验法则是确定有多少客户端想要被通知一个事件。如果主要是一个对象(例如,关闭视图或对点击按钮采取行动,或者对下载失败做出反应),那么您应该使用委托模式。

如果您发出的事件可能同时对许多对象感兴趣(例如,屏幕旋转、内存使用情况、用户登录/注销),那么您应该使用 NSNotificationCenter


29
我还要补充一点,通知(例如DidFireMissle)是单向的,而如果你需要返回信息(例如-(BOOL)shouldFireMissle),则需要使用代理。请注意,翻译后保持原意,使语言更加通俗易懂,不得添加解释或其他内容。 - benzado
8
实际上,你可以在传递消息时携带一个对象,接收者可以更改。需要注意的是,多个(或零个)接收者可能会处理通知,但这是有效的。 - Glenn Maynard

40

它们的目的是不同的:

  • 通知被用于向可能来自发送者未知的多个接收者广播消息。

  • 委托被用于代表发送者向单个已知接收者发送消息。


12

通知通常更适合用于通知UI其他线程上发生的更改。苹果公司的文档强烈反对在可能的情况下跨线程使用委托,这样做不仅会影响稳定性,还会影响性能。在Mac上,他们建议使用Bindings,但由于它们在iPhone上不存在,通知可能是您的下一个最佳选择。


7
考虑性能是一个好主意(委托模式对少量被通知对象更好,通知中心对于大量对象更好,或者不是吗?运行一次分析器就可以了),但我认为,更重要的因素是减少模块之间的编译时依赖。由于你谈论的是Objective-C,而不太可能谈论代码库中真正高性能的部分,这些部分很可能是用C语言编写的。
你可以使用代理数组而不是单个代理,没有必要限制使用单个代理。
我可能只在任何网络堆栈组件和任何自定义设备状态监视界面的状态方面使用NSNotificationCenter。但是对于大多数耦合,与应用程序的全局状态无关,我认为在大多数情况下,使用Objective-C中的普通接口契约更清晰,并且对于后来的人更容易理解,而不是使用NSNotificationCenter。事实上,我从来没有使用NotificationCenter来处理自己的自定义事件,而是更喜欢使用代理,以便其他人在阅读我的代码时更容易理解。
最后,当然,在使用标准API的通知时,你没有选择,必须使用Apple为特定事件规定的两种方法之一。

6

通知更适合解耦UI组件。它允许您在不修改控制器或模型的情况下插入任何视图。绝对更适合松耦合设计。

但是对于委托和通知之间的性能,您需要考虑调用的频率。

对于更频繁的事件,委托可能更好,而对于更少的事件但更多的接收者,通知更好。选择什么取决于项目。


3
在这两者之间的一个选择是使用观察者模式,而不需要使用NSNotificationCenter。可以查看我在Objective-C中实现的这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接