iOS通知机制NotificationCenter
iOS通知机制NotificationCenter

iOS通知机制NotificationCenter

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 进入后台或前台

设备旋转、键盘弹起等系统事件

可以把它理解成广播机制,多个对象可以订阅同一个事件,当事件发生时,所有订阅者都会收到通知。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注