我正在构建一个非常依赖CloudKit作为数据源的iOS应用程序。
安装应用程序并首次运行后,我需要下载大量驻留在CloudKit Container公共数据库中的数据。我使用CKFetchNotificationChangesOperation
每次启动应用程序时都会运行此操作,以检查自我收到的上一次服务器更改令牌以来的数据更改。显然,在第一次启动应用程序时,我必须提供的更改令牌为nil,这将导致CKFetchNotificationChangesOperation
加载数据库上发生的所有更改。
然后返回的数据将存储在本地,因为我希望拥有与我的用户相关的所有数据的本地缓存。我将这些数据存储在核心数据库中。由于第一次启动时应用程序需要的数据集可能很大,我真的需要CKFetchNotificationChangesOperation来获取服务器上的所有更改。\
然而,这似乎不可靠。使用我在数据库中输入的一些数据测试此服务时,我没有收到我应该收到的所有数据。 当我在公共数据库中输入更多数据时,CKFetchNotificationChangesOperation
似乎完全忽略了我之前输入的记录。有时候,有些人会漏掉但是非常不可靠。
显然,我已经验证我的订阅是合法的(之前已加载相同的记录),并且我已检查moreComing
的{{1}}参数是否为真(始终为{{1} }})
问题
在初始加载时,如何在公共数据库中获取所有数据?我认为CKFetchNotificationChangesOperation
应该做的工作,但似乎不可靠。是否有类似“范围”的东西我可以在此操作上配置以强制它加载我的所有数据?或者false
不适合初始加载,我应该只通过自定义操作加载我需要的所有数据吗?
答案 0 :(得分:3)
根据我发现的有关通知消息的内容,似乎问题可能源于两种可能性中的一种,也许两种:
可以使用记录的本地存储(数组或字典)及其元数据来修复这两种情况。如Apple的Maintaining a Local Cache of CloudKit文档中所述。
拥有本地存储的记录将允许您填充初始数据集,同时对更改进行任何更新,同时等待通过CloudKit完成任何异步延迟。
拥有已查看的每个 NEW notificationID
的本地数组。正如本StackQuestion Q& A所述,readNotifications似乎是一个反复出现的问题。将通知标记为已读将阻止通知在将来的提取中返回,但在CloudKit数据库更新之前它们可能会导致问题。
~~~~~~~~~~~~~~~~~~~~~~~~~链接解决方案~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
THIS是一个Stack Overflow问题和答案,其中包含用于解决类似问题的代码,但它不包含有关如何/为何如何工作的详细信息。因此,结帐this是之前关联的Q& As之一,如果需要,可以进一步详细说明。
如果您有任何问题和/或想要任何澄清,请告诉我。
••••••••••••••••••••••••••••••••••••••••••••••• •••••••••••••••••••••••••••••••••••••••••••••••••• ••••••••••••••
•••WWDC CloudKit Best Practices(从12点45分开始进入视频)