CloudKit - 哪个CKErrors应该作为.partialFailure处理,它们是否也应该作为非部分失败处理?

时间:2018-03-15 18:36:51

标签: ios swift cloudkit

我已经构建了基本的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这样的完整操作,如果这很重要?

提前致谢!

1 个答案:

答案 0 :(得分:6)

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

我同意你的观点,文件不清楚只会出现部分错误和什么不可能。加上两种情况都会发生什么。要回答这个问题,您可以采用一种简单的方法,假设在两种情况下都可能发生所有错误,或者通过找出每种错误的可能情况,您可以采用另一种更详细的方法。 对于第二种方法,我必须模拟不同的错误情况,并查看从iCloud Server获得的错误。请考虑以下几点:

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