【问题标题】:CloudKit - which CKErrors should be handled as .partialFailure, and should they also be handled as a non-partial failure?CloudKit - 哪些 CKErrors 应该作为 .partialFailure 处理,它们是否也应该作为非部分故障处理?
【发布时间】:2018-03-15 18:36:50
【问题描述】:

我已经构建了基本的 CloudKit 同步引擎并且可以正常工作,现在我正在充实我的错误处理。当您收到 .partialFailure 响应代码时,我想要一份完整的列表,列出每条记录可能出现的错误。

文档有一个所有error codes 的列表,但在我的搜索中(对我而言)并不明显,它们可能会显示在 partialErrorsByItemID 字典中,并且只会显示为错误代码(或者如果它们可以同时显示,也许只发送一条记录?)。

在 Apple CloudKit 共享代码示例中,有一个 CloudKitError 类来处理错误,并处理以下部分错误:

.serverRecordChanged
.zoneNotFound
.unknownItem
.batchRequestFailed

但我不认为这是详尽无遗的,因为课程的其余部分在处理不是 .partialFailure 的错误方面并不详尽。 .invalidArguments 肯定是可能的部分失败错误吗?

以下是我想我需要介绍的内容:

.alreadyShared (if sharing)
.assetFileModified (if using Assets)
.assetFileNotFound (if using Assets)
.batchRequestFailed
.constraintViolation
.invalidArguments
.referenceViolation (if sharing)
.serverRecordChanged
.unknownItem
.zoneBusy?
.zoneNotFound

最后,因为这些是作为部分错误处理的,我是否还需要将它们作为可能来自 CloudKit 的错误代码响应来处理,就像我处理非部分错误代码(如 .serviceUnavailable)一样?我没有使用 CKDatabase 便捷方法,我使用的是 CKModifyRecordsOperation 之类的完整操作,如果这很重要?

提前致谢!

【问题讨论】:

    标签: ios swift cloudkit


    【解决方案1】:

    在 CloudKit 中,您有便捷的 API 和批量操作 API。如果您只在应用程序中使用便捷 API,这意味着您一次添加/更新/获取/删除一条记录。因此,您将永远不会收到CKErrorPartialFailure,因为您不与 iCloud 服务器进行批量通信。如果您在应用程序中仅使用 Batch Operations API,那么您将获得CKErrorPartialFailure。这是一个高级错误,实际上包含您操作中包含的每个记录/区域/订阅的子错误(CKError 实例)。

    我同意您的观点,文档并不清楚哪些只能作为部分错误发生,哪些不能。再加上这两种情况下可能发生的事情。要回答这个问题,您可以采用一种简单的方法,即假设所有错误都可能在这两种情况下发生,或者您可以采用另一种更详细的方法,找出每个错误的可能情况。

    对于第二种方法,我必须模拟不同的错误场景,看看我从 iCloud 服务器收到了哪些错误。请注意以下几点:

    1. 尽可能多地尝试 CKOperation 以获得错误列表。您有记录、区域、数据库、订阅的操作。
    2. 操作是否是原子操作?
    3. 有些错误无法模拟,因为我们不以任何方式控制 iCloud 服务器响应。示例:CKInternalError, CKServerRejectedRequest
    4. 某些错误只会在开发阶段发生,不应在生产阶段发生。示例:CKBadContainer,CKMissingEntitlement,CKBadDatabase
    5. 有些错误显然是非部分错误,因为它们与发送到 iCloud 的整个请求更相关。示例:CKIncompatibleVersion, CKServiceUnavailable, CKRequestRateLimited, CKOperationCancelled, CKLimitExceeded, CKServerResponseLost, CKManagedAccountRestricted
    6. 某些错误只能作为部分错误出现。示例CKBatchRequestFailed。这仅发生在原子 CKOperations
    7. 某些错误可能同时出现部分/非部分错误。示例:CKNotAuthenticated, CKNetworkUnavailable, CKNetworkFailure。它们作为记录区域操作的部分错误发生,而它们作为记录操作的非部分错误发生。
    8. 使用批处理操作 API 时,某些与区域相关的错误将显示为部分错误。示例:CKUserDeletedZone , CKZoneBusy。例外:CKChangeTokenExpired 我在执行基于操作的调用时将其视为非部分错误。
    9. CKZoneNotFound 作为部分和非部分错误发生。如果您使用CKModifyRecordsOperation 上传到不存在的区域,您将收到部分错误。但是,如果您使用CKFetchRecordZoneChanges 从不存在的区域中获取,您将得到非部分错误。
    10. 使用 Batch Operations API 时,合并冲突错误作为部分错误发生。
    11. 在WWDC 2015 Video 中,CKInvalidArguments 被提及为使用批处理操作 API 时可能作为部分错误发生的错误之一。但是,我尝试了不同的错误场景(例如:在同一请求中创建/更新记录)并且它作为非部分错误发生。所以为了安全起见,我可能会同时处理部分和非部分错误。
    12. CKQuotaExceeded 作为非部分错误发生。我设法通过使用来自除照片之外的不同应用程序的数据填充我的 iCloud 存储来重现该错误。备份将填满大部分存储空间,然后再填满剩余的可用空间并不难。
    13. CKUnkownItem 在使用便捷 API 时作为非部分错误发生。使用 Batch Operation API 时也会出现部分错误。
    14. 所有与共享/资产相关的错误,我不熟悉,但我认为您在问题中列出的相关错误,可以视为部分错误。

    【讨论】:

    • 这是我在任何地方看到的最彻底的答案(相信我我看过)。文件应该告诉我们什么。从你们的 cmets 那里有很多不明显的,我将不得不离开并重新考虑我如何处理其中的一些。
    • 精彩的解释。我想在批处理 CKModifyRecordsOperation 中添加部分错误。如果操作要保存少量记录,其中一些记录已经存储在数据库中,那么 partialError 将发生并且 partialErrorsByItemID 将包含 serverRecordChanged已存在的项目和未存储在该批次中的项目的 batchRequestFailed。当然,如果动作是原子的。
    猜你喜欢
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 2012-05-15
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    相关资源
    最近更新 更多