【问题标题】:iOS: CKFetchNotificationChangesOperation results incompleteiOS:CKFetchNotificationChangesOperation 结果不完整
【发布时间】:2018-02-09 10:24:54
【问题描述】:

我正在构建一个严重依赖 CloudKit 作为数据源的 iOS 应用。

在安装应用程序并首次运行后,我需要下载大量数据,这些数据位于我的 CloudKit Container 的公共数据库中。我用CKFetchNotificationChangesOperation 做这个

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

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

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

显然,我已经验证了我的订阅是合法的(之前加载了相同的记录),并且我已经检查了 CKFetchNotificationChangesOperationmoreComing 参数是否为真(它始终是 false

问题

我应该怎么做才能在初始加载时获取公共数据库中的所有数据?我认为CKFetchNotificationChangesOperation 应该完成这项工作,但它似乎不可靠。我可以在此操作上配置“范围”之类的东西以强制它加载我的所有数据吗?还是CKFetchNotificationChangesOperation 不适合初始加载,我应该只通过自定义操作加载我需要的所有数据吗?

【问题讨论】:

    标签: ios notifications icloud cloudkit subscriptions


    【解决方案1】:

    根据我对通知消息的发现,似乎问题可能源于以下两种可能性之一:

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

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

    情况一:

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

    情况2:

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

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~

    THIS 是一个堆栈溢出问题和答案,其中包含用于解决类似问题的代码,尽管它不包含有关其工作方式/原因的详细信息。因此,请查看this,这是之前链接的问答之一,如果需要,它会更详细地介绍。

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

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

    ••• WWDC CloudKit Best Practices(从 12:45 左右开始进入视频)

    【讨论】:

    • 感谢您的回答!我已经更新了我的问题,因为我意识到我遗漏了一些重要的东西。我确实希望维护已下载数据的本地缓存。我的问题仅在首次启动应用程序时出现,此时本地尚未缓存任何数据:我从不完整的更改中获得的通知。 CKFetchNotificationChangesOperation 似乎有某种“范围”,因为它可靠地加载新记录并错过旧记录。我现在有疑问:我是否应该编写一个操作,只下载我想要的所有数据而不考虑更改?还是继续这样做?
    • 不客气。您是否尝试过将您访问过的所有通知 ID 存储到设备(可能是 pList),然后您可以将您的列表与来自 CloudKit 的记录进行交叉引用?
    • 我不确定这是否能解决问题。我知道所有订阅都有效,因为现在没有收到的通知之前确实收到了。这让我非常困惑,并且给我的印象是订阅有某种范围。
    • 您是否熟悉 CloudKit 的数据库如何利用 zones?在重新观看了 WWDC CloudKit 最佳实践之后,我相对确定您一直引用的“范围”实际上是特定区域:私有、公共、共享甚至自定义。我已经用 WWDC 链接和 CK 团队讨论它们的时间更新了我的答案
    • 是的,我对区域很熟悉,而且我知道这个问题不是由它们引起的,因为我将所有测试记录都存储在一个区域中。我一直提到一个范围,因为我似乎只能在某个时间点或某个数量之内收到通知。这也没有意义,因为我的 moreComing 参数是错误的。目前,我构建了一个解决方法,它只下载所有初始数据,从那时起依赖于通知,效果很好。但是,这仍然不能解决核心问题:为什么我会收到带有错误 MoreComing 参数的不完整通知?
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多