SwiftUI可以利用NotificationCenter(通知中心),实现对iCloud Key-Value Store 数据的双向同步与监听。
使用方法
1、监听通知(添加 Observer)
在代码中,可以监听(addObserver)特定的通知,比如 iCloud 数据变化:
NotificationCenter.default.addObserver(
self,
selector: #selector(handleNotification(_:)),
name: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
object: NSUbiquitousKeyValueStore.default
)
otificationCenter.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() /// 自定义的同步iCloud方法
}
/// 监听应用生命周期事件
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方法,从而实现全局事件的监听。
相关文章
1、iOS通知机制NotificationCenter:https://fangjunyu.com/2025/03/01/ios%e9%80%9a%e7%9f%a5%e6%9c%ba%e5%88%b6notificationcenter/
