iOS 16.0后NSUbiquitousKeyValueStore内部修改触发外部通知问题
iOS 16+ NSUbiquitousKeyValueStore 本地写入触发外部通知的问题
确实有不少开发者碰到过这个情况——iOS 16之后NSUbiquitousKeyValueStore的通知逻辑和之前不一样了:在iOS 16以前的版本里,本地写入操作不会触发didChangeExternallyNotification,但升级到iOS 16及以后,执行写入的设备自己也会收到这个通知,而且通知里的变更原因会被标记为服务器同步或初始同步类的外部变更,而非内部操作标识,这就很容易导致业务逻辑陷入循环。
常见的解决思路是:
- 在发起本地写入前,设置一个临时标记(比如布尔变量
isLocalWriteInProgress),标记当前正在执行本地写入操作 - 在
didChangeExternallyNotification的回调里,先检查这个标记:如果是本地写入触发的通知,直接跳过后续处理逻辑;如果是外部设备同步来的变更,再正常处理 - 写入操作完成后,务必把这个标记重置,避免影响后续的外部通知处理
还有开发者补充,部分场景下仅靠标记可能不够,还可以结合通知里NSUbiquitousKeyValueStoreChangedKeysKey返回的变更键,和本地缓存的键值做对比,进一步过滤掉本地写入产生的无效通知。
内容的提问来源于stack exchange,提问作者Patrick Koning
相关产品推荐
相关产品推荐

