我正在尝试与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)
因此结果操作无法正常工作。其他块按预期调用。
文档说每个区域应该调用标记块,但根本不调用它。
我真的很感激任何帮助。
非常感谢。
答案 0 :(得分:3)
服务器更改令牌在不同的块中返回 - 您需要使用recordZoneFetchCompletionBlock。
答案 1 :(得分:0)
关于 recordZoneChangeTokensUpdatedBlock 的 CKFetchRecordZoneChangesOperation 头文件:
客户负责保存每个记录区
serverChangeToken
,并将其传递给对CKFetchRecordZoneChangesOperation
的下一个调用。请注意,提取可能会中途失败。如果发生这种情况,则可能会在此块中返回更新的更改令牌,这样就无需在后续操作中重新下载已获取的记录。
在区域中的最后一批更改之后,将不会调用
recordZoneChangeTokensUpdatedBlock
;recordZoneFetchCompletionBlock
块将被调用此区域上最新发布的
clientChangeTokenData
中的CKModifyRecordsOperation
也将返回,如果未提供,则返回nil。如果服务器返回
如果CKErrorChangeTokenExpired
错误,则在初始化此操作时用于此记录区的serverChangeToken
太旧,客户端应扔掉其本地缓存并重新获取该记录中的更改区域以零serverChangeToken
开头。recordZoneChangeTokensUpdatedBlock
为否,则不会调用
fetchAllChanges
。
获取函数定义以查看它。 (单击鼠标左键,然后在 recordZoneChangeTokensUpdatedBlock 上选择跳转到定义)
因此对于开发人员来说,这意味着,在巨大请求(例如1000条记录)期间,如果发生某些错误,可以从中断的那一点开始启动一个新请求,并且只能下载其余项。实际上,今天,每收到200个项目,就需要巨大的请求此回调,以提供新的更改令牌。因此,可以以某种方式处理在发生错误之前收到的项目,并可以稍后从该点触发更新。
最后,答案是:该块被要求巨大的请求。您可以通过创建几百个项目然后尝试获取它们来进行尝试。