这比出于好奇更重要。
docs clearly state上,我们可以在iOS上使用KVS(键值存储)存储的键数应该硬限制为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自己管理的东西。模拟器中的KVS,但我并不乐观)。
我以为自己在某种程度上犯了一个错误,并且误解了我所看到的内容,但是对我似乎超出此限制的任何见解都将受到赞赏。
最佳答案
那不是1000个键,而是三个键(changecount,dirtykeys,values),内部有2个大数组。
这样,您就可以确定,直到使用这些大型阵列之一达到1MB的值限制为止。但是,通过这种方式,您将无法在不将整个阵列拉到设备的情况下查找任何条目,并且在更改它时会写入整个阵列。