他们每个人的利弊是什么? 我应该在哪里专门使用它们?
答案 0 :(得分:100)
这里的经验法则是有多少客户希望收到有关活动的通知。如果它主要是一个对象(例如,关闭视图或对点击的按钮采取行动,或对下载失败做出反应),那么您应该使用委托模型。
如果您发出的事件可能同时引起许多对象的兴趣(例如屏幕旋转,内存使用,用户登录/注销),那么您应该使用NSNotificationCenter
。
答案 1 :(得分:34)
他们的目的不同:
通知用于向发件人未知的几个收件人广播邮件。
委派用于向代表发件人的单个已知收件人发送邮件。
答案 2 :(得分:12)
通知通常更好地通知UI其他线程上发生的更改。出于稳定性和性能原因,Apple的文档强烈反对在可能的情况下跨线程使用委托。在Mac上,他们建议使用Bindings,但由于它们不存在于iPhone上,通知可能是您的下一个最佳选择。
答案 3 :(得分:7)
考虑到性能是一个好主意(对于少量通知对象更好地委派,更好地通知中心对于大量对象,或者是?运行探查器)但是我认为更重要的因素是因为你在谈论Objective -C并且不太可能讨论代码库中真正高性能的部分(可能用C语言编写),这减少了模块之间的编译时依赖性。
没有什么可以阻止你拥有一组代表而不是一个代表。
我可能只将NSNotificationCenter用于我制作的任何网络堆栈组件的状态以及任何自定义设备状态监视接口。但对于大多数耦合而言,与应用程序的全局状态无关,我认为在大多数情况下使用Objective-C中的常规接口契约更为清晰,并且对于追随您的人来说比使用NSNotificationCenter更容易。事实上,我从未将NotificationCenter用于我自己的自定义事件,并且更倾向于使用委托来方便其他人阅读我的代码来理解代码。
最后,当然,通过标准API的通知,您无法选择,并且必须使用Apple为特定事件禁用的两种方法中的任何一种。
答案 4 :(得分:6)
通知更适合解耦UI组件。它允许您在控制器或模型中插入任何视图而无需任何修改。松散耦合设计绝对更好。
但是,对于授权和通知之间的性能,您需要考虑呼叫的频率。
对于更频繁的事件,委派可能会更好,对于频率较低的事件而言,通知会更好,但收件人会更多。它可以预测要选择的内容。
答案 5 :(得分:3)
这两者之间的选项是使用观察者模式,没有NSNotificationCenter
。看看我的Objective-C实现here。