什么是"范围"一个CKServerChangeToken?

时间:2017-01-27 19:28:40

标签: ios cloudkit

https://developer.apple.com/reference/cloudkit/ckserverchangetoken中所述,CloudKit服务器返回更改令牌,作为CKFetchRecordZoneChangesOperation回调响应的一部分。对于后续记录提取的集合,我应该在我的提取调用中包含给定的更改标记吗?

  • 仅提取到我们从中获取的区域?
  • 或者它是否适用于该区域所在的db的任何提取?或者数据库所在的整个容器?<​​/ li>
  • app扩展程序怎么样? (应用扩展程序与主应用程序具有相同的iCloud用户,但有一个不同的&#34;用户&#34;由fetchUserRecordIDWithCompletionHandler:返回,至少在我的测试中)是否适合从主应用程序提供更改令牌在来自,例如,消息应用程序扩展的提取调用?我不这么认为,但是我希望有正式的官方回答。

1 个答案:

答案 0 :(得分:2)

我也发现CKServerChangeToken的范围有点不清楚。但是,在查看了文档之后,CKFetchDatabaseChangesOperationCKFetchRecordZoneChangesOperation提供并管理自己的服务器更改令牌。

如果您决定在获取更改时(大约8分钟左右)遵循CloudKit工作流程Dave Browning在其2017 WWDC talk中的概述,这将特别有用。

推荐的方法是:

1)使用CKFetchDatabaseChangesOperation获取数据库更改。通过changeTokenUpdatedBlock收到更新的令牌后,请在本地保留该令牌。该令牌被“作用域”到添加了操作的私有或共享CKDatabase上。公用数据库不提供更改令牌。

2)如果在上一操作中通过recordZoneWithIDChangedBlock接收到区域ID,则表明存在可以通过CKFetchRecordZoneChangesOperation获取的更改区域。此操作通过相当麻烦的初始值设定项参数CKFetchRecordZoneChangesOperation.ZoneConfiguration来获取自己的唯一服务器更改令牌。这是针对此特定CKRecordZone的“作用域”。因此,同样,当通过recordZoneChangeTokensUpdatedBlock接收更新的令牌时,它需要在本地持久保存(也许使用与其CKRecordZone.ID相关的密钥)。

这样做的好处是,它可以最大程度地减少网络呼叫的次数。如果数据库未报告任何更改的区域ID,则首先获取数据库更改会阻止对每个记录区域进行调用。

这是CloudKit团队的code sample,贯穿此工作流程。可以接受的是,自那时以来,其中一些API发生了变化,并且注释并未明确指出服务器更改令牌的“作用域”。