我正在我的应用程序中进行CloudKit同步(“Tiny data,all devices”模型,私有数据库中有自定义区域)。
CKModifyRecordsOperation
包含clientChangeTokenData
类型的NSData
属性,文档中描述如下:
从提取操作修改记录时,请使用此属性指定客户端生成的数据令牌,以指示上次修改的记录的版本。比较您在下一次记录提取中提供给数据令牌的数据令牌,以确认服务器已成功接收到设备的上次修改请求。
我不明白为什么我应该打扰,因为每个请求,我得到一个完成块,告诉我服务器是否已成功收到我的请求。为什么我需要手动比较此客户端令牌?
是否需要指定clientChangeTokenData
才能正确处理我的用例?我跟踪本地数据更改并在每次数据更改时推送队列中的所有内容。通过区域订阅跟踪远程更改。
如果需要,我如何正确生成此令牌,因为我的CKModifyRecordsOperation
中有各种记录更改(我的API使用目的是批处理操作)。这里的一般工作流程是什么?
谢谢。
答案 0 :(得分:3)
如果您想要写入CloudKit的本地更改,并且您希望确保您的更改基于CloudKit中的最新数据版本,则您只有理由检查令牌。
您也可以忽略该令牌并保存数据。如果数据在平均时间内发生了变化,您将收到CloudKit错误,然后您可以处理它。
答案 1 :(得分:3)
从文档中不清楚所以我猜测clientChangeTokenData
在发送大型修改记录操作时非常有用,例如:删除100条记录。然后说你的应用程序在另一个操作中发送一个获取请求,其中一个查询(或获取更改)结果集将受到以下修改的影响:
如果获取完成包含与使用修改发送的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;
});
});
}
}
,那么您知道它还没有收到(或已完成处理?)更改。在这种情况下,您可能会出现错误,提示服务器需要更多时间,或者在一段时间后自动重试提取。
顺便说一下,在我的测试中,这个令牌是每个设备。