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

时间:2018-09-06 01:58:20

标签: ios swift

这更多是出于好奇。

docs clearly state规定,我们可以在iOS上使用KVS(键值存储)存储的键数应严格限制为1024。

  

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

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

我使用UITableView来显示来自KVS的数据,并且在缓慢滚动浏览每条记录后,一切似乎都在那里。

screenshot of ios showing a tableview with data

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

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

我能够删除该应用程序,重新安装它,并按预期从KVS下载中查看所有数据。我已启用适当的权利,并且同步似乎可以正常工作。因此,看来必须将数据通过iCloud备份到KVS。

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

(注意:我正在编写"1", "2"之类的键,诸如此类:NSUbiquitousKeyValueStore.default.set(dict, forKey: id)changecountdirtykeysvaluesplist中的文件似乎是KVS自己管理的东西。我认为这个plist可能是在模拟器中偷偷摸摸地查看KVS的内容,但我并不乐观。

screenshot of plist contents

我以为我在某种程度上犯了一个错误,并且误解了我所看到的内容,但是对我似乎超出这一限制的任何见解都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

那不是1000个键,而是三个键(changecount,dirtykeys,values),内部有2个大数组。

以这种方式进行操作,直到您用这些大型阵列之一达到1MB的值限制时,您都可以了。但是,通过这种方式,您将无法在不将整个阵列拉到设备的情况下查找任何条目,并且在更改时将整个阵列写入。