NSNotificationCenter vs委托(使用协议)?

他们每个人的优点和缺点是什么?
我应该在哪里具体使用它们?

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

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

他们的目的是不同的:

  • 通知用于向发送方未知的几个收件人广播消息。

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

通知通常更好地通知UI在其他线程上发生的变化。 苹果公司的文档强烈build议在可能的情况下跨线程使用委托,以保持稳定性和性能。 在Mac上,他们build议使用绑定,但由于iPhone不存在,通知可能是您的下一个最好的select。

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

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

我只能使用NSNotificationCenter作为我制作的任何networking堆栈组件的状态和任何自定义设备状态监视接口。 但对于大多数耦合而言,与应用程序的全局状态无关,我认为在大多数情况下,在Objective-C中使用正常的接口协议更为明确,而且更容易跟随您的人使用NSNotificationCenter。 事实上,我从来没有使用过NotificationCenter来处理我自己的自定义事件,而更倾向于使用委托代码,以便他人阅读我的代码来简化代码的理解。

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

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

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

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

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