NSNotifications —整个事实

尽管每篇文章都以其实现和用法解释了NSNotifications,但很少有人对它的基础知识给予足够的重视。 在这里,我试图突出显示遗漏的这些点。

使用NotificationCenter,您可以将数据从应用程序的一部分广播到另一部分。 它使用“ 观察者”模式 ,通过称为“ 通知中心”的中央调度程序,在收到通知时通知注册的观察者

NotificationCenter 究竟 如何 工作?

它基本上有三个组成部分

  • 侦听通知的“侦听器”,称为观察者
  • “发件人”,在发生某些情况时发送通知
  • 通知中心本身,可跟踪观察者和通知

NSNotificationCenter可以处理一对多和多对多通信。

您何时使用 NotificationCenter

  1. 当应用程序的两个或多个没有正式连接的组件之间进行通信时,
  2. 当沟通需要反复一致地进行时
  3. 使用一对多或多对多通讯时

您如何注册观察员?

  NotificationCenter.default.addObserver(自身,选择器:#selector(onDidReceiveData(_ :)),名称:.didReceiveData,对象:无) 

addObserver(_:selector:name:object:)函数具有4个参数:

  • 第一个参数observer未命名的 ,您可以为其提供对作为该通知观察者的对象的引用,该对象通常是self
  • 第二个参数selector是在发生通知时要调用的函数,其作用类似于目标动作模式
  • 第三个参数name是您要侦听的通知的名称,其类型为Notification.Name
  • 第四个参数object是一个可选对象,您希望接收其通知,因此,如果设置了该对象,则只会从该“发送者”接收通知

您如何添加通知?

 扩展Notification.Name { 
静态let didReceiveData = Notification.Name(“ didReceiveData”)静态let didCompleteTask = Notification.Name(“ didCompleteTask”)静态letcompleteLengthyDownload = Notification.Name(“ completedLengthyDownload”)
} NotificationCenter.default.addObserver(自身,选择器:[selector],名称:.didCompleteTask,对象:nil)

您如何发布通知?

  NotificationCenter.default.postNotification(名称:.didReceiveData,对象:无) 

onDidReceiveData(_:)函数如下所示:

  @objc func onDidReceiveData(_通知:通知) 
{如果让数据= notification.userInfo为? [String:Int]
{
用于数据中的(名称,分数)
{
打印(“ \(名称)已发送\(分数)分!”)
}
}
}

在上面的示例中,发生这种情况:

  • 首先,您使用条件绑定将类型转换 运算符 as?userInfo的类型转换[String: Int] as? 。 因为userInfo的类型为[AnyHashable: Any]? –基本上是任何词典 –您可以将其类型转换为所需的词典类型。 那是字符串键,在上面的示例中是整数值。 如果转换成功,则data包含类型为[String: Int]userInfo值。
  • 然后,使用for-in循环,对data字典中的项目进行迭代。 我们正在使用元组(name, score)来分解字典项的键和值。
  • 最后,在循环中,我们将打印出名称和分数。

要发布包含数据的通知,我们可以这样做:

  let scores = [“ A”:5,“ B”:3,“ C”:42] NotificationCenter.default.postNotification(名称:.didReceiveData,对象:self,userInfo:scores) 

该类可能如下所示:

 类API 
{
静态让共享= API()
func getData()
{NotificationCenter.default.postNotification(name:.didReceiveData,object:self,userInfo:...)
}
}

快速摘要:

  • 首先,使用以下命令注册观察者的通知: addObserver(_:selector:name:object:)
  • 然后,使用postNotification(name:object:userInfo:)发布通知…
  • …之后您的选择器被调用
  • 并且不要忘记使用removeObserver(...)删除观察者removeObserver(...)

您可以使用NotificationCenter进行重复,一致的一对多或多对多通信。

通知与代表

通知更像是无线电广播,可以在任何对象中广播,任何人都可以收听通知,观察和调用操作,例如UIKit,键盘API,监听通知,不保证有一对多对象的通知

委托-当您必须将信息从一个对象发送到任何其他对象时,一个对象只能有一个委托,这意味着它们具有一对一的关系和紧密耦合的关系,例如其将响应发生的事情进行处理或者当您将某事物委托给特定对象时,可以保证它会提供功能,

怀疑-对象可以有多个委托,一些对象也可以承担多个委托的职责,就像多委托者一样。

下一读:代表团-全部真相