云套件。未调用 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】:从关于recordZoneChangeTokensUpdatedBlock的CKFetchRecordZoneChangesOperation头文件:
客户负责保存这个 per-recordZone
serverChangeToken
并将其传递给下一次对CKFetchRecordZoneChangesOperation
的调用。请注意,提取可能会中途失败。如果发生这种情况,可能会在此块中返回更新的更改令牌,以便在后续操作中无需重新下载已获取的记录。
recordZoneChangeTokensUpdatedBlock
不会在一个区域的最后一批更改之后被调用;将改为调用recordZoneFetchCompletionBlock
块此区域上最近发布的
CKModifyRecordsOperation
中的clientChangeTokenData
也会返回,如果没有提供,则返回 nil。如果服务器返回
CKErrorChangeTokenExpired
错误,则在启动此操作时用于此记录区域的serverChangeToken
太旧,客户端应丢弃其本地缓存并重新获取此记录区域中的更改,以无serverChangeToken
。如果
fetchAllChanges
为NO,则不会调用recordZoneChangeTokensUpdatedBlock
。
获取函数定义以查看它。 (左键单击并选择 recordZoneChangeTokensUpdatedBlock 上的跳转到定义)
所以对于开发者来说,这意味着,在巨大的请求期间(例如 1000 条记录),如果发生错误,可以从中断的点开始新的请求,并且只能下载其余的项目。实际上,今天,每收到 200 个项目,就会调用这个回调来请求巨大的请求,提供新的更改令牌。因此,可以以某种方式处理在错误发生之前收到的项目,并且可以稍后从该点触发更新。
最后,答案是:这个块被调用一个巨大的请求。您可以尝试创建数百个项目并获取它们。
【讨论】:
以上是关于云套件。未调用 CKFetchRecordZoneChangesOperation 的令牌更改块的主要内容,如果未能解决你的问题,请参考以下文章