我如何在 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)
。changecount
、dirtykeys
和 values
条目在该 plist
文件中似乎是什么KVS 自己管理。我认为这个plist
可能是在模拟器中对 KVS 的一瞥,但我并不肯定)。
我假设我在某种程度上犯了一个错误并且我误解了我所看到的,但是任何关于我似乎超出此限制的见解将不胜感激。
【问题讨论】:
【参考方案1】:这不是 1000 个键,而是三个键(changecount、dirtykeys、values),里面有 2 个大数组。
这样做,直到您使用其中一个大型数组达到 1MB 值限制之前,您都可以。但是,这样做您将无法查找任何条目,除非将整个数组拉到设备上,并在更改时写入整个数组。
【讨论】:
有趣且观察力强。最初我并没有过多考虑这三个键是什么。我不会直接将changecount
、dirtykeys
或values
写到KVS。你知道那些是什么吗?我认为它们是 KVS 自己创建的底层结构。我正在将我的数据写入 KVS,如下所示:NSUbiquitousKeyValueStore.default.set(dict, forKey: id)
,我的演示数据的每个键都类似于 "1", "2"
等...以上是关于我如何在 NSUbiquitousKeyValueStore 中存储超过 1024 个键?的主要内容,如果未能解决你的问题,请参考以下文章