SwiftUI监听iCloud数据变化
SwiftUI监听iCloud数据变化

SwiftUI监听iCloud数据变化

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/

   

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

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

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