【问题标题】:CloudKit. Token change block of CKFetchRecordZoneChangesOperation not called云套件。未调用 CKFetchRecordZoneChangesOperation 的令牌更改块
【发布时间】: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)

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

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

非常感谢任何帮助。

非常感谢。

【问题讨论】:

    标签: ios swift icloud cloudkit


    【解决方案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 个项目,就会调用这个回调来请求巨大的请求,提供新的更改令牌。因此,可以以某种方式处理在错误发生之前收到的项目,并且可以稍后从该点触发更新。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多