如https://developer.apple.com/reference/cloudkit/ckserverchangetoken中所述,CloudKit服务器返回更改令牌,作为CKFetchRecordZoneChangesOperation回调响应的一部分。对于后续记录提取的集合,我应该在我的提取调用中包含给定的更改标记吗?
答案 0 :(得分:2)
我也发现CKServerChangeToken
的范围有点不清楚。但是,在查看了文档之后,CKFetchDatabaseChangesOperation
和CKFetchRecordZoneChangesOperation
都提供并管理自己的服务器更改令牌。
如果您决定在获取更改时(大约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发生了变化,并且注释并未明确指出服务器更改令牌的“作用域”。