NSNotificationCenter addObserver 在 Swift 中:完整指南与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

NSNotificationCenter addObserver 在 Swift 中:带实际示例的完整指南



想象一下,您正在编写一个披萨订购应用。用户在购物车界面点击“支付”,几秒钟后,另一个界面——“订单状态”——应自动显示披萨已在途中。如何连接这两个界面,而不会让代码变成由闭包和委托组成的意大利面条?答案是 NSNotificationCenter(在现代 Swift 中,就是 NotificationCenter)。



这种模式是 iOS 开发中最流行的模式之一。在 Stack Overflow 上,“NSNotificationCenter addObserver in Swift”这个问题获得了数千次浏览,因为即使是经验丰富的开发人员有时也会在语法、内存管理和观察者移除方面感到困惑。让我们一劳永逸地弄清楚如何在 Swift 中正确使用通知。



什么是 NotificationCenter,为什么需要它?



NotificationCenter 是 iOS 内置的一种机制,实现了“观察者”模式。它允许一个对象(发送者)发送消息,而其他对象(观察者)订阅这些消息并做出响应。主要优点是低耦合:发送者和接收者彼此完全不了解。



何时有用:

  • 一个界面通知另一个界面某个操作(例如,购物车 → 订单状态)
  • 对系统事件做出响应(键盘出现、应用进入后台)
  • 后台数据加载完成后更新 UI


在旧项目(Objective-C)中,使用 NSNotificationCenter;在 Swift 中,从 iOS 9 开始,它简称为 NotificationCenter。在本文中,我们将使用现代 Swift 语法。



如何订阅通知:addObserver



addObserver 方法是系统的核心。它将一个对象注册为特定通知的观察者。有两种主要方式:通过选择器(经典方式)和通过闭包。



1. 带选择器的 addObserver 方法(target-action)



这种方法源自 Objective-C。您指定观察者对象、选择器(将被调用的方法)、通知名称,以及可选的发送者对象。



import UIKit

class OrderStatusViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 订阅支付通知 NotificationCenter.default.addObserver( self, selector: #selector(didReceivePaymentNotification(_:)), name: Notification.Name("PaymentDidSucceed"), object: nil ) } @objc func didReceivePaymentNotification(_ notification: Notification) { print("支付成功!更新订单状态。") // 在此处更新 UI } // 重要:不要忘记取消订阅! deinit { NotificationCenter.default.removeObserver(self) }}


这里重要的是:

  • 处理程序方法必须标记为 @objc——这是 Objective-C 运行时的要求。
  • 参数 notification 的类型是 Notification,包含 userInfo——一个带有附加数据的字典。
  • 如果传递 object: nil,观察者将接收来自任何发送者的通知。


2. 带闭包的 addObserver 方法(iOS 9+)



现代且更安全的方式是使用闭包。它不需要 @objc,并且允许捕获外部变量。



class PaymentManager {        private var observer: NSObjectProtocol?        func startObservingPayment() {        observer = NotificationCenter.default.addObserver(            forName: Notification.Name("PaymentDidSucceed"),                

博客

书籍推荐