iOS:CKFetchNotificationChangesOperation结果不完整

时间:2017-08-31 12:50:02

标签: ios notifications icloud cloudkit subscriptions

我正在构建一个非常依赖CloudKit作为数据源的iOS应用程序。

安装应用程序并首次运行后,我需要下载大量驻留在CloudKit Container公共数据库中的数据。我使用CKFetchNotificationChangesOperation

执行此操作

每次启动应用程序时都会运行此操作,以检查自我收到的上一次服务器更改令牌以来的数据更改。显然,在第一次启动应用程序时,我必须提供的更改令牌为nil,这将导致CKFetchNotificationChangesOperation加载数据库上发生的所有更改。

然后返回的数据将存储在本地,因为我希望拥有与我的用户相关的所有数据的本地缓存。我将这些数据存储在核心数据库中。由于第一次启动时应用程序需要的数据集可能很大,我真的需要CKFetchNotificationChangesOperation来获取服务器上的所有更改。\

然而,这似乎不可靠。使用我在数据库中输入的一些数据测试此服务时,我没有收到我应该收到的所有数据。 当我在公共数据库中输入更多数据时,CKFetchNotificationChangesOperation似乎完全忽略了我之前输入的记录。有时候,有些人会漏掉但是非常不可靠。

显然,我已经验证我的订阅是合法的(之前已加载相同的记录),并且我已检查moreComing的{​​{1}}参数是否为真(始终为{{1} }})

问题

在初始加载时,如何在公共数据库中获取所有数据?我认为CKFetchNotificationChangesOperation应该做的工作,但似乎不可靠。是否有类似“范围”的东西我可以在此操作上配置以强制它加载我的所有数据?或者false不适合初始加载,我应该只通过自定义操作加载我需要的所有数据吗?

1 个答案:

答案 0 :(得分:3)

根据我发现的有关通知消息的内容,似乎问题可能源于两种可能性中的一种,也许两种:

  • 正在存储记录asynchronously,在填充本地数据集时会出现意外延迟。
  • 阅读通知混淆了所需的查询/订阅结果。

可以使用记录的本地存储(数组或字典)及其元数据来修复这两种情况。如Apple的Maintaining a Local Cache of CloudKit文档中所述。

情况1:

拥有本地存储的记录将允许您填充初始数据集,同时对更改进行任何更新,同时等待通过CloudKit完成任何异步延迟。

情况2:

拥有已查看的每个 NEW notificationID的本地数组。正如本StackQuestion Q& A所述,readNotifications似乎是一个反复出现的问题。将通知标记为已读将阻止通知在将来的提取中返回,但在CloudKit数据库更新之前它们可能会导致问题。

~~~~~~~~~~~~~~~~~~~~~~~~~链接解决方案~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~

THIS是一个Stack Overflow问题和答案,其中包含用于解决类似问题的代码,但它不包含有关如何/为何如何工作的详细信息。因此,结帐this是之前关联的Q& As之一,如果需要,可以进一步详细说明。

如果您有任何问题和/或想要任何澄清,请告诉我。

••••••••••••••••••••••••••••••••••••••••••••••• •••••••••••••••••••••••••••••••••••••••••••••••••• ••••••••••••••

•••WWDC CloudKit Best Practices(从12点45分开始进入视频)