CloudKit。未调用CKFetchRecordZoneChangesOperation的令牌更改块

时间:2017-01-16 20:47:29

标签: ios swift icloud cloudkit

我正在尝试与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)

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

文档说每个区域应该调用标记块,但根本不调用它。

我真的很感激任何帮助。

非常感谢。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

关于 recordZoneChangeTokensUpdatedBlock CKFetchRecordZoneChangesOperation 头文件:

  

客户负责保存每个记录区serverChangeToken,并将其传递给对CKFetchRecordZoneChangesOperation的下一个调用。

     

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

     在区域中的最后一批更改之后,将不会调用

recordZoneChangeTokensUpdatedBlockrecordZoneFetchCompletionBlock块将被调用

     

此区域上最新发布的clientChangeTokenData中的CKModifyRecordsOperation也将返回,如果未提供,则返回nil。

     

如果服务器返回CKErrorChangeTokenExpired错误,则在初始化此操作时用于此记录区的serverChangeToken太旧,客户端应扔掉其本地缓存并重新获取该记录中的更改区域以零serverChangeToken开头。

     如果recordZoneChangeTokensUpdatedBlock为否,则不会调用

fetchAllChanges

获取函数定义以查看它。 (单击鼠标左键,然后在 recordZoneChangeTokensUpdatedBlock 上选择跳转到定义

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

最后,答案是:该块被要求巨大的请求。您可以通过创建几百个项目然后尝试获取它们来进行尝试。