什么是CKModifyRecordsOperation中的clientChangeTokenData?

时间:2016-02-02 11:45:53

标签: ios cloudkit ckmodifyrecordsoperation

我正在我的应用程序中进行CloudKit同步(“Tiny data,all devices”模型,私有数据库中有自定义区域)。

CKModifyRecordsOperation包含clientChangeTokenData类型的NSData属性,文档中描述如下:

  

从提取操作修改记录时,请使用此属性指定客户端生成的数据令牌,以指示上次修改的记录的版本。比较您在下一次记录提取中提供给数据令牌的数据令牌,以确认服务器已成功接收到设备的上次修改请求。

我不明白为什么我应该打扰,因为每个请求,我得到一个完成块,告诉我服务器是否已成功收到我的请求。为什么我需要手动比较此客户端令牌?

是否需要指定clientChangeTokenData才能正确处理我的用例?我跟踪本地数据更改并在每次数据更改时推送队列中的所有内容。通过区域订阅跟踪远程更改。

如果需要,我如何正确生成此令牌,因为我的CKModifyRecordsOperation中有各种记录更改(我的API使用目的是批处理操作)。这里的一般工作流程是什么?

谢谢。

2 个答案:

答案 0 :(得分:3)

如果您想要写入CloudKit的本地更改,并且您希望确保您的更改基于CloudKit中的最新数据版本,则您只有理由检查令牌。

您也可以忽略该令牌并保存数据。如果数据在平均时间内发生了变化,您将收到CloudKit错误,然后您可以处理它。

答案 1 :(得分:3)

从文档中不清楚所以我猜测clientChangeTokenData在发送大型修改记录操作时非常有用,例如:删除100条记录。然后说你的应用程序在另一个操作中发送一个获取请求,其中一个查询(或获取更改)结果集将受到以下修改的影响:

  1. 启动并同时运行到尚未完成的现有修改操作。
  2. 在服务器处理完之前修改的结果之前启动(文档倾向于暗示处理延迟)。
  3. 如果获取完成包含与使用修改发送的clientChangeTokenData不同的[self.cvTag addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil]; - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { float newHeight = self.cvTag.collectionViewLayout.collectionViewContentSize.height; if (self.verticalConstraintTag.constant != newHeight) { self.verticalConstraintTag.constant = newHeight; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{ if (self.reloadBlock) self.reloadBlock(); self.reloadBlock = nil; }); }); } } ,那么您知道它还没有收到(或已完成处理?)更改。在这种情况下,您可能会出现错误,提示服务器需要更多时间,或者在一段时间后自动重试提取。

    顺便说一下,在我的测试中,这个令牌是每个设备。