NSNotificationCenter与委派(使用协议)?


Answers:


104

经验法则是希望有多少个客户收到事件通知。如果主要是一个对象(例如,关闭视图或对单击的按钮采取行动,或对失败的下载做出反应),则应使用委托模型。

如果您发出的事件可能一次引起许多对象的关注(例如,屏幕旋转,内存使用,用户登录/注销),则应使用NSNotificationCenter


28
我还要补充一点,通知是单向的(例如DidFireMissle),而如果您需要返回信息(例如),则需要委托-(BOOL)shouldFireMissle
benzado

8
@benzado:实际上,您可以将对象与消息一起传递,接收者可以更改消息。您需要记住,多个(或零个)接收者可能会处理该通知,但这是有效的。
格伦·梅纳德

37

它们的目的不同:

  • 通知用于将消息广播给发件人未知的几个收件人。

  • 委托用于将消息发送给代表发件人的单个已知收件人。


12

通知通常更适合于通知UI其他线程上发生的更改。Apple的文档出于稳定性和性能方面的考虑,强烈建议尽可能不要在线程之间使用委托。在Mac上,他们建议使用绑定,但是由于在iPhone上不存在,因此通知可能是您的第二选择。


7

考虑性能是一个好主意(对于较少数量的通知对象,更好的委派;对于较大数量的对象,通知中心更好的;或者运行探查器),但是我认为这是一个更重要的因素,因为您在谈论Objective-C和不太可能谈论可能用C语言编写的代码库中真正高性能的部分,这减少了模块之间的编译时依赖性。

没有什么可以阻止您拥有一组委托而不是一个委托。

我可能只将NSNotificationCenter用于我制作的任何网络堆栈组件的状态以及任何自定义设备状态监视接口。但是,对于大多数耦合而言,与应用程序的全局状态无关,我认为在大多数情况下,在Objective-C中使用常规接口协定更容易,并且比使用NSNotificationCenter更容易为后继的人提供帮助。实际上,我从未将NotificationCenter用于自己的自定义事件,而是更喜欢使用委托来简化其他人阅读我的代码的代码理解。

最后,当然,在通知标准API或从标准API发出通知的情况下,您别无选择,必须使用Apple禁止给定事件的两种方法中的任何一种。


6

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

但是,为了在委派和通知之间实现性能,您需要考虑呼叫的频率。

委派对于更频繁的事件可能更好,通知对于更不频繁的事件更好,但接收者更多。取决于要选择什么。


3

这两者之间的选择是使用观察者模式,不使用NSNotificationCenter。在这里查看我的Objective-C实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.