云套件。未调用 CKFetchRecordZoneChangesOperation 的令牌更改块

Posted

技术标签:

【中文标题】云套件。未调用 CKFetchRecordZoneChangesOperation 的令牌更改块【英文标题】:CloudKit. Token change block of CKFetchRecordZoneChangesOperation not called 【发布时间】:2017-01-16 20:47:28 【问题描述】:

我正在尝试实现与 CloudKit 的同步。 要从服务器获取更改,我正在使用 CKFetchRecordZoneChangesOperation。 但是根本没有调用 recordZoneChangeTokensUpdatedBlock。 这是代码:

let options = CKFetchRecordZoneChangesOptions()
options.previousServerChangeToken = changesToken

let operation = CKFetchRecordZoneChangesOperation(recordZoneIDs: [paletteZoneId], optionsByRecordZoneID: [paletteZoneId:options])
operation.fetchAllChanges = true

operation.recordChangedBlock = (record) in
   ...


operation.recordWithIDWasDeletedBlock =  (recordId,str) in
    ...


operation.recordZoneChangeTokensUpdatedBlock =  recordZoneId, token, data in
    print("new token")
    self.changesToken = token



operation.fetchRecordZoneChangesCompletionBlock =  error in
    ...


privateDB.add(operation)

因此结果操作无法正常工作。其他块按预期调用。

文档说应该按区域调用令牌块,但根本不调用它。

非常感谢任何帮助。

非常感谢。

【问题讨论】:

【参考方案1】:

服务器更改令牌在不同的块中返回 - 您需要使用 recordZoneFetchCompletionBlock。

【讨论】:

感谢@ChrisDeft:这很有帮助,虽然我本以为是另一个功能(recordZoneChangeTokensUpdatedBlock INSTEAD OF recordZoneFetchCompletionBlock)【参考方案2】:

从关于recordZoneChangeTokensUpdatedBlockCKFetchRecordZoneChangesOperation头文件:

客户负责保存这个 per-recordZone serverChangeToken 并将其传递给下一次对 CKFetchRecordZoneChangesOperation 的调用。

请注意,提取可能会中途失败。如果发生这种情况,可能会在此块中返回更新的更改令牌,以便在后续操作中无需重新下载已获取的记录。

recordZoneChangeTokensUpdatedBlock 不会在一个区域的最后一批更改之后被调用;将改为调用 recordZoneFetchCompletionBlock

此区域上最近发布的CKModifyRecordsOperation 中的clientChangeTokenData 也会返回,如果没有提供,则返回 nil。

如果服务器返回 CKErrorChangeTokenExpired 错误,则在启动此操作时用于此记录区域的 serverChangeToken 太旧,客户端应丢弃其本地缓存并重新获取此记录区域中的更改,以无serverChangeToken

如果fetchAllChanges 为NO,则不会调用recordZoneChangeTokensUpdatedBlock

获取函数定义以查看它。 (左键单击并选择 recordZoneChangeTokensUpdatedBlock 上的跳转到定义

所以对于开发者来说,这意味着,在巨大的请求期间(例如 1000 条记录),如果发生错误,可以从中断的点开始新的请求,并且只能下载其余的项目。实际上,今天,每收到 200 个项目,就会调用这个回调来请求巨大的请求,提供新的更改令牌。因此,可以以某种方式处理在错误发生之前收到的项目,并且可以稍后从该点触发更新。

最后,答案是:这个块被调用一个巨大的请求。您可以尝试创建数百个项目并获取它们。

【讨论】:

以上是关于云套件。未调用 CKFetchRecordZoneChangesOperation 的令牌更改块的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云功能本地代码更改未反映在模拟器中

Oracle SOA套件12c

华为云计算基础-华为云计算套件

云套件不会触发 NSUbiquityIdentityDidChangeNotification

阿里云-物联网套件体验

TestNG [错误] 未找到测试套件。没啥可跑的