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 问题

我如何在 NSUbiquitousKeyValueStore 中存储超过 1024 个键?

使用 NSUbiquitousKeyValueStore 在 iOS 应用和 OSX 应用之间共享 iCloud 数据