NSNotificationCenter和委派简介

NSNotificationCenter和委派是每种允许您在iOS项目的各个类中交流信息的方法。 但是这些概念之间有什么区别? 您什么时候可以使用另一个? 有没有要考虑的缺点? 让我们潜入。

什么是授权?

委托是一种设计模式,顾名思义,它出于沟通目的将一类的责任和控制权委托给另一类。 基本上,一个类(委托人)陈述了另一类(或委托人)必须遵守的某些行为。 因此,委托人可以指望每次使用委托人时都会执行的行为。 此外,委托可以返回信息。

委派的一个示例是内置的UITableViewDelegate,它具有许多(可选)方法。 如Apple所述,例如func tableView(UITableView, didSelectRowAt: IndexPath)是一种告诉UITableViewDelegate现在已选择指定行的方法。 换句话说,表视图执行此操作的委托委托给它的委托,该委托返回有关选择了哪一行的信息。

可以将委托通信与电话进行比较:只有委托人和委托人正在互相交谈。 在审查NSNotificationCenter时请记住这一点!

什么是NSNotificationCenter?

苹果将​​NSNotificationCenter描述为“一种在程序中传播信息的机制。” NSNotificationCenter发送通知,观察者被设置为“监听”该通知,然后采取自己的指定动作。 NSNotificationCenter提供了一种将事件通知多个对象的方法。 (请注意,一旦观察者不再需要侦听通知,则也需要将其删除。)

与委托电话的类比不同,NSNotificationCenter更像是无线电广播:多个接收者可以收听和收听消息,但不能将信息中继回发送者。

行动!

所有通过NSNotificationCenter或委托进行的通信都用于创建操作。 使用NSNotificationCenter,设置为侦听/观察的任何实例都将在“听到”通知后立即执行自己的操作。 对于委派,代表必须采取委派者提出的具体行动,只要考虑到所有这些行动,就可以按照需要的顺序调用这些行动。

想象一下NSNotificationCenter的竞赛。 跑步者(观察者)正在收听起跑喇叭(通知)。 一听到他们的声音,每个跑步者便开始自己的动作:奔跑,跳跃,走路,停下来系鞋带等。起跑号角并不能控制跑步者在做什么,但确实会导致他们开始!

同时,想象一下种族作为代表的清理工作人员。 赛事组织者(代表)已汇总了赛事结束后需要清洁的所有区域的清单:垃圾桶,街道,看台等。清洁人员(代表)必须完成组织者已安排的任务,但是他们的任务可以按照当时最有意义的顺序进行:说他们只有在清理看台后才能进入街道,因此他们要先看台。 清理人员还可以将有关清理工作发生情况的信息返回给比赛组织者。 尽管组织者和清理人员只是互相交流,但组织者绝对可以依靠清理人员来完成工作!

外卖

这就是说NSNotificationCenter和委托用于非常不同的情况:NSNotification用于在类之间发送一对多消息,而委托用于发送一对一消息。 设置代表正在创建一个耦合关系,其中两个对象彼此直接通信。 同时,NSNotificationCenter是一个更加分离的关系。

在使用方面,如果需要将单个事件通知多个对象,则NSNotificationCenter可以完成此工作。 如果需要执行特定操作,或者接收方需要将信息返回给发送方,则委派是一个不错的选择。

更多的听众,更多的问题……

另一个使用注意事项可能是调试。 在研究此主题时经常出现的问题是调试NSNotificationCenter问题的难度,因为观察者/侦听器的数量越多,越难分辨是什么引起了问题并追踪问题。 正如许多消息来源很快指出的那样,对于开始使用NSNotificationCenter调试与应用程序流和控制相关的问题的现有项目的开发人员而言,这尤其困难。

资源资源

https://developer.apple.com/reference/foundation/nsnotificationcenter

https://www.raywenderlich.com/90773/introducing-ios-design-patterns-in-swift-part-2

http://useyourloaf.com/blog/delegation-or-notification/

https://www.andrewcbancroft.com/2015/02/05/nsnotificationcenter-vs-delegation-analysis/

http://www.andrewcbancroft.com/2015/03/26/what-is-delegation-a-swift-developers-guide/

http://www.andrewcbancroft.com/2014/10/08/fundamentals-of-nsnotificationcenter-in-swift/