NSUbiquitousKeyValueStore 与 NSUserDefaults
Posted
技术标签:
【中文标题】NSUbiquitousKeyValueStore 与 NSUserDefaults【英文标题】:NSUbiquitousKeyValueStore vs NSUserDefaults 【发布时间】:2017-04-25 20:41:43 【问题描述】:来自Apple's NSUbiquitousKeyValueStore documentation:
如果您在用户未登录 iCloud 帐户时写入键值存储对象,则数据将存储在本地,直到下一次同步机会。当用户登录 iCloud 帐户时,系统会自动将您的本地磁盘键和值与 iCloud 服务器上的键和值进行核对。
因此,如果用户从未登录 iCloud 帐户,则键值存储对象会无限期地存储在本地,就像 NSUserDefaults 一样。
在这种情况下,我们是否都应该停止使用 NSUserDefaults 而只使用 NSUbiquitousKeyValueStore 作为所有应用程序的“默认值”?这种方法有什么缺点?
我可以看到的一个优势是,从用户的角度来看,应用偏好将在他们的所有设备上同步,这很可能是更好的用户体验!
【问题讨论】:
【参考方案1】:我们应该清楚地知道,iCloud中的NSUbiquitousKeyValueStore
是用于配置和跟踪某个帐户的所有设备上的应用程序状态。
关于NSUbiquitousKeyValueStore
的一些事实。
在文档中我们可以找到:
避免将此类用于对您的应用至关重要的数据 离线时的行为;相反,将此类数据直接存储到 本地用户默认数据库。
而且可以保存的数据量也比较小。
应用的键值对存储中的可用空间总量,用于 给定的用户,是 1 MB。每个键值的大小限制为 1 MB, 和最多 1024 个键。
【讨论】:
【参考方案2】:我发现如果用户进入他们的 iCloud 设置并关闭您的应用程序开关 - 您将无法再保存到 NSUbiquitousKeyValueStore。
您的应用将从启用它开始。然后你可以在那里保存数据。关闭 iCloud 后,它始终可以读取 - 但如果您更新数据并重新启动应用程序,我相信您会看到它恢复到用户在 iCloud 设置中关闭 iCloud 支持之前的状态。
这是我目前正在处理的一个问题。我正在尝试找到一种方法来测试该开关是否打开/关闭并将我的数据存储更改为 NSUserDefaults。
如果我错了,请纠正我,但这是我迄今为止发现的。
-标记
编辑:这仅适用于您已注册 iCloud 文档的情况。如果您只使用 NSUbiquitousKeyValueStore 它应该几乎相同 - 我相信。
edit-edit:现在它的表现不同了。只有在 iCloud 功能中选中 NSUbiquitousKeyValueStore 时,该开关才会出现。因此,再次寻找一种方法来检测是否为 iCloud 设置中的应用翻转了该开关。
【讨论】:
我遇到了同样的问题。我通过将日期保存到云和磁盘来解决它,如果云数据早于磁盘数据,则忽略它。以上是关于NSUbiquitousKeyValueStore 与 NSUserDefaults的主要内容,如果未能解决你的问题,请参考以下文章
如何确定“NSUbiquitousKeyValueStore.default.set”结果是不是成功
NSUbiquitousKeyValueStore 与 NSUserDefaults
NSUbiquitousKeyValueStore 类和 -boolForKey: 方法
Provisioning Profile 和 NSUbiquitousKeyValueStore 问题