ios - CloudKit - 哪些 CKError 应该作为 .partialFailure 处理,它们是否也应该作为非部分故障处理?

标签 ios swift cloudkit

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

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

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

.serverRecordChanged
.zoneNotFound
.unknownItem
.batchRequestFailed

但我认为这不是详尽无遗的,因为类(class)的其余部分在处理不是 .partialFailure 的错误时并不详尽。 .invalidArguments 肯定会是一个可能的部分失败错误吗?

这是我想我需要涵盖的内容:
.alreadyShared (if sharing)
.assetFileModified (if using Assets)
.assetFileNotFound (if using Assets)
.batchRequestFailed
.constraintViolation
.invalidArguments
.referenceViolation (if sharing)
.serverRecordChanged
.unknownItem
.zoneBusy?
.zoneNotFound

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

提前致谢!

最佳答案

在 CloudKit 中,您有便捷 API 和批量操作 API。如果您只在您的应用程序中使用便捷 API,这意味着您一次添加/更新/获取/删除一条记录。因此,您永远不会得到 CKErrorPartialFailure因为你是 不是 批量与 iCloud 服务器通信。如果您在应用程序中仅使用批量操作 API,那么您将收到 CKErrorPartialFailure .这是一个高级错误,实际上包含您的操作中包含的每个记录/区域/订阅的子错误(CKError 实例)。
我同意你的观点,文档并不清楚哪些只会作为部分错误发生,哪些不会。加上这两种情况下可能发生的情况。要回答这个问题,您可以采用一种简单的方法,假设所有错误都可能在两种情况下发生,或者您可以采用另一种更详细的方法,找出每个错误的可能情况。
对于第二种方法,我必须模拟不同的错误场景并查看我从 iCloud 服务器收到哪些错误。请考虑以下几点:

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

    相关文章:

    ios - Swift 中的 UIButton 未注册触摸

    iOS 如何以编程方式简单地返回到先前呈现/推送的 View Controller ?

    swift - 从 NSWindowController 以编程方式呈现 View Controller

    swift - 重构两个类似的 swift switch 语句

    iOS:对于用户来说,CloudKit 登录是什么样的?

    ios - 无法查询用户 CKRecords

    Android 和 iPhone UI 组件比较

    javascript - 如何在 UIWebView 中调整图像大小?

    objective-c - 如何使我的 Objective-C 类符合 Swift 的 `Equatable` 协议(protocol)?

    ios - CloudKit CKRecordZone