NotificationCenter 是 iOS/macOS 开发中的发布-订阅模式(Publish-Subscribe)的通知机制,用于在应用内的不同部分之间传递消息。
NotificationCenter作用
让不同的对象进行通信,而不需要直接引用对方(解耦)。
一个对象发送通知,多个对象可以接收并作出反应。
适用于监听系统级别或自定义的事件(如键盘弹起、iCloud 数据变化等)。
NotificationCenter 的核心概念
1、Notification
通知(Notification)就是一条消息,比如:
“iCloud 数据发生变化了”
“用户登录成功了”
“键盘弹出来了”
“App 进入后台”
2、Observer(监听者)
监听者(Observer)可以监听特定的通知,当通知发布时,监听者会执行相应的方法。
3、Post(发送通知)
发布者(Post)可以向 NotificationCenter 发送通知,通知会被所有监听它的对象接收。
NotificationCenter 用法
1、监听通知(添加 Observer)
在代码中,可以监听(addObserver)特定的通知,比如 iCloud 数据变化:
NotificationCenter.default.addObserver(
self,
selector: #selector(handleNotification(_:)),
name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
object: NSUbiquitousKeyValueStore.default
)
NotificationCenter.default.addObserver(…) → 监听特定通知。
selector: #selector(handleNotification(_:)) → 当收到通知时,执行 handleNotification(_:) 方法。
name: NSUbiquitousKeyValueStore.didChangeExternallyNotification → 监听 iCloud 数据变化。
object: NSUbiquitousKeyValueStore.default → 监听 iCloud KVS(Key-Value Store) 的变化。
2、处理通知
当 NotificationCenter 收到通知后,会执行 handleNotification(_:) 方法:
@objc private func handleNotification(_ notification: Notification) {
print("收到 iCloud 数据变化通知!")
}
3、发送通知
某些时候,可以主动发送通知:
NotificationCenter.default.post(
name: Notification.Name("MyCustomNotification"),
object: nil
)
这样,所有监听 MyCustomNotification 的对象都会收到通知。
4、移除监听
在 deinit 中移除监听,避免内存泄漏:
deinit {
NotificationCenter.default.removeObserver(self)
}
实际应用
监听iCloud和应用生命周期事件,调用对应的方法。
/// 监听 iCloud 变化,同步到本地
private func observeiCloudChanges() {
NotificationCenter.default.addObserver(
self,
selector: #selector(iCloudDidUpdate),
name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
object: NSUbiquitousKeyValueStore.default
)
}
/// iCloud 数据变化时,更新本地数据
@objc private func iCloudDidUpdate(notification: Notification) {
loadFromiCloud()
}
/// 监听应用生命周期事件
private func observeAppLifecycle() {
NotificationCenter.default.addObserver(
self,
selector: #selector(appWillResignActive),
name: UIApplication.willResignActiveNotification,
object: nil
)
}
/// 当应用进入后台时,将数据同步到 iCloud
@objc private func appWillResignActive() {
syncToiCloud()
}
当iCloud发生变化时,调用iCloudDidUpdate方法,该方法会执行loadFromiCloud方法(该方法表示将iCloud数据同步到本地,在此处省略)。
当应用生命周期发生变化时,同样会调用appDidEnterBackground,该方法也会调用syncToiCloud方法,将数据同步到iCloud。
在类的构造方法中,调用这两个方法,实现监听:
@Observable
class AppStorageManager {
static let shared = AppStorageManager() // 全局单例
private init() {
// 监听 iCloud 变化,同步到本地
observeiCloudChanges()
// 监听应用进入后台事件
observeAppLifecycle()
}
}
在构造方法中运行对应的NotificationCenter方法,从而实现全局事件的监听。
总结
NotificationCenter 适用于全局事件监听,比如:
iCloud 数据变化
用户登录状态变化
App 进入后台或前台
设备旋转、键盘弹起等系统事件
可以把它理解成广播机制,多个对象可以订阅同一个事件,当事件发生时,所有订阅者都会收到通知。