Swift 中的 NSNotificationCenter addObserver


本文旨在解释 iOS 应用程序如何使用 NSNotificationCenter 发送和接收更改事件。

在 iOS 应用程序中,您可能需要在应用程序的任何位置发送和接收事件。当您需要在应用程序的任何位置接收事件时,使用 NSNotificationCenter 类可能很有用。在这种情况下,您可以监听事件并做出相应的反应。

NSNotificationCenter 类位于 Foundation 框架中,它提供了一种向已注册的观察者广播通知的机制。它允许对象相互通信并响应程序中发生的事件。

如何发布事件?

语法

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; }} */ } }

在此示例中,User 实例使用 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)") }

NSNotification 中心有三种重载方法来发布通知:

  • NotificationCenter.default.post(notification:) - 如果您只需要发布一个没有任何上下文的通知,请使用此方法。

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

  • NotificationCenter.default.post(name:object:userInfo:) - 此方法是最完整的方法。您指定通知名称、对象(再次是发送者)和 userInfo 字典。您可以使用此字典向观察者提供其他数据。在我们的示例中,我们可以提供刚刚添加到应用程序的图片。

结论

在使用 NotificationCenter 类发送和接收事件时,请记住它们会向整个应用程序广播消息。您必须非常小心地发布和接收事件,并且仅在需要时才这样做。

更新于: 2023年1月3日

3K+ 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始
广告