Swift中的NSNotificationCenter addObserver

Swift中的NSNotificationCenter addObserver

本文的目的是解释一个iOS应用程序如何使用NSNotificationCenter发送和接收变化事件。

在一个iOS应用程序中,你可能需要在应用程序的任何地方发送和接收事件。当你需要在应用中的任何地方接收事件时,使用NSNotificationCenter类可能是有用的。在这种情况下,你可以监听事件并作出相应的反应。

Foundation框架中的NSNotificationCenter类,提供了一个向注册的观察者广播通知的机制。它允许对象之间相互通信,并对程序中发生的事件做出反应。

如何发布一个事件

语法

NotificationCenter.default.post(name: <NSNotification.Name>, object: <Any?>, userInfo: <[AnyHashable : Any]?>)

NotificationCenter提供了一个post()方法来发送一个事件。要发布一个事件,你必须把通知的名称作为一个身份传递。如果你不想发送任何其他信息,你可以忽略对象和用户信息。

示例

下面是一个如何使用NSNotificationCenter发布通知的例子 —

import Foundation
class User {
   var userId: String = ""
   func doLogout() {
      // write your code to logout the user
      // you will send an event once the user will be logged out. For example,
      NotificationCenter.default.post(name: NSNotification.Name("UserLoggedOut"),
      object: nil,
      userInfo: ["userId": userId])
   }
}

如何接收一个事件

语法

NotificationCenter.default.addObserver(<observer: Any>, selector: <Selector>, name: <NSNotification.Name?>, object: <Any?>)

NotificationCenter提供了一个addObserver()方法来接收一个事件。为了监听一个事件,你必须在目标通知名下添加一个观察者。如果你发送一个对象,你将会收到一个对象。

示例

下面是一个如何使用NSNotificationCenter来接收通知的例子 —

import Foundation
import UIKit
class HomeController: UIViewController {
   override func viewDidLoad() {
      super.viewDidLoad()
      NotificationCenter.default.addObserver(self, selector: #selector(handleLoggedOutNotification), name: NSNotification.Name("UserLoggedOut"), object: nil)
   }
   @objc private func handleLoggedOutNotification(_ notification: NSNotification) {
      print("notification: \(notification)")
      /*
      {name = UserLoggedOut; userInfo = {
         userId = 123;
      }}
      */
   }
}

在这个例子中,用户实例使用NSNotificationCenter的post方法发布了 “UserLoggedOut “通知。HomeController类被注册为该通知的观察者,当收到该通知时,它的handleLoggedOutNotification方法被调用。

必须注意的是,通知是异步广播的,这意味着观察者可能不会在通知发布后立即收到通知。

管理你的自定义通知

在实际应用中,你可能需要发送和接收多个具有自定义名称的通知。一旦你发布了一个通知,你就必须传递NSNotificationName对象来识别该通知。

示例

要注册你自己的自定义通知,我们建议你为NSNotification.Name类写一个扩展,并将你所有的相关通知添加到其中。比如说。

Import Foundation
extension NSNotification.Name {
   static let userLoggedIn = NSNotification.Name("userLoggedIn")
   static let userLoggedOut = NSNotification.Name("userLoggedOut")
   static let userProfilePhotoChanged = NSNotification.Name("userProfilePhotoChanged")
}

我们正在扩展NSNotificationName并添加不同的通知名称。

现在,在发送和接收通知时,将很容易提供名称,就像下面这样——。

import Foundation
func send() {
   NotificationCenter.default.post(name: .userLoggedOut, object: nil, userInfo: ["userId": "123"])
}
func receive() {
   NotificationCenter.default.addObserver(self, selector: #selector(handleLoggedOutNotification), name: .userLoggedOut, object: nil)
}
@objc private func handleLoggedOutNotification(_ notification: NSNotification) {
   print("notification: \(notification)")
}
  • NotificationCenter.default.post(notification:) – 如果你只需要发布一个没有任何背景的通知,请使用此方法。

  • NotificationCenter.default.post(name:object:) – 如果你需要发布通知并关心谁在发布,请使用此方法。对象人是发送者,是发布通知的对象。

  • NotificationCenter.default.post(name:object:userInfo:) – 这个方法是最完整的一个。你指定通知的名称、对象(又是发送者)和一个userInfo字典。你可以使用这个字典来向观察者提供额外的数据。在我们的例子中,我们可以提供刚刚添加到应用程序中的图片。

结论

当你使用NotificationCenter类来发送和接收事件时,请记住它们会在整个应用程序中广播这些信息。你必须非常小心地发布和接收事件,并且只在需要时才发布。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Swift 教程