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

Posted

技术标签:

【中文标题】我如何在 NSUbiquitousKeyValueStore 中存储超过 1024 个键?【英文标题】:How am I storing more than 1024 keys in NSUbiquitousKeyValueStore? 【发布时间】:2018-09-06 01:58:20 【问题描述】:

这更多是出于好奇。

docs clearly state 表示我们可以在 ios 上使用 KVS(Key-Value Store)存储的密钥数量应该有 1024 个硬性限制。

对于给定用户,您应用的键值对存储中的可用空间总量为 1 MB。每个键值的大小限制为 1 MB,最多 1024 个键。如果您尝试写入超出这些配额的数据,写入尝试会失败,并且不会对您的 iCloud 键值存储进行任何更改。在这种情况下,系统会发布带有 NSUbiquitousKeyValueStoreQuotaViolationChange 更改原因的 didChangeExternallyNotification 通知。

我创建了一个演示应用程序,它在 KVS 中填充了 1025 个(超过限制的 1 个)不同的键。从技术上讲,它是 1026,因为我还存储了一个 ids 数组来索引每个 KVS 键。

我使用 UITableView 显示来自 KVS 的数据,在慢慢滚动每条记录后,它们似乎都在那里。

如果我从上到下滚动,我可以看到我的演示应用程序中列出的所有 1025 个条目。

我能超过 1024 的限制对我来说似乎很奇怪。

我可以删除该应用程序,重新安装它,然后按预期查看 KVS 下载的所有数据。我启用了适当的权利,并且同步似乎有效。因此,据我所知,数据似乎必须通过 iCloud 备份到 KVS。

使用带有模拟器的 iCloud 帐户和 brctl log --wait --shorten,我在我的机器上的模拟器目录中找到了一个 plist 文件,该文件似乎同意为应用程序存储了超过 1024 个密钥

(注意:我正在编写诸如 "1", "2" 之类的键,等等:NSUbiquitousKeyValueStore.default.set(dict, forKey: id)changecountdirtykeysvalues 条目在该 plist 文件中似乎是什么KVS 自己管理。我认为这个plist 可能是在模拟器中对 KVS 的一瞥,但我并不肯定)。

我假设我在某种程度上犯了一个错误并且我误解了我所看到的,但是任何关于我似乎超出此限制的见解将不胜感激。

【问题讨论】:

【参考方案1】:

这不是 1000 个键,而是三个键(changecount、dirtykeys、values),里面有 2 个大数组。

这样做,直到您使用其中一个大型数组达到 1MB 值限制之前,您都可以。但是,这样做您将无法查找任何条目,除非将整个数组拉到设备上,并在更改时写入整个数组。

【讨论】:

有趣且观察力强。最初我并没有过多考虑这三个键是什么。我不会直接将changecountdirtykeysvalues 写到KVS。你知道那些是什么吗?我认为它们是 KVS 自己创建的底层结构。我正在将我的数据写入 KVS,如下所示:NSUbiquitousKeyValueStore.default.set(dict, forKey: id),我的演示数据的每个键都类似于 "1", "2" 等...

以上是关于我如何在 NSUbiquitousKeyValueStore 中存储超过 1024 个键?的主要内容,如果未能解决你的问题,请参考以下文章

我无法理解如何在 c# 中使用正则表达式或如何解决我的问题

在 jQuery 中,如果元素包含属性,无论其值如何,我如何找到它们? [复制]

我如何在 jwt 令牌中设置过期 30 分钟

如何在pycharm中重新连接我的头?

我如何在 Django 中查询评论

如何在 Codeigniter 中检查是不是设置了会话?