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