我已经构建了基本的 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 服务器收到哪些错误。请考虑以下几点:
CKInternalError, CKServerRejectedRequest
CKBadContainer,CKMissingEntitlement,CKBadDatabase
CKIncompatibleVersion, CKServiceUnavailable, CKRequestRateLimited, CKOperationCancelled, CKLimitExceeded, CKServerResponseLost, CKManagedAccountRestricted
CKBatchRequestFailed
.这个只发生在原子 CKOperations CKNotAuthenticated, CKNetworkUnavailable, CKNetworkFailure
.它们作为记录区域操作的部分错误发生,而它们作为记录操作的非部分错误发生。 CKUserDeletedZone , CKZoneBusy
.异常(exception):CKChangeTokenExpired
当我执行基于操作的调用时,我将其视为非部分错误。 CKZoneNotFound
作为部分和非部分错误发生。如果您使用 CKModifyRecordsOperation
上传到一个不存在的区域,你会得到一个部分错误。但是,如果您使用 CKFetchRecordZoneChanges
要从不存在的区域中获取,您将收到非部分错误。 CKInvalidArguments
被提及为使用 Batch Operations API 时可能作为部分错误发生的错误之一。但是,我尝试了不同的错误场景(例如:在同一请求中创建/更新记录)并且它作为非部分错误发生。所以为了安全起见,我可能会处理部分错误和非部分错误。 CKQuotaExceeded
作为非部分错误发生。我设法通过使用来自不同应用程序(照片除外)的数据填充我的 iCloud 存储空间来重现该错误。备份将填满大部分存储空间,然后填满剩余的可用空间就不难了。 CKUnkownItem
使用便捷 API 时作为非部分错误发生。使用 Batch Operation API 时也会作为部分错误发生。 关于ios - CloudKit - 哪些 CKError 应该作为 .partialFailure 处理,它们是否也应该作为非部分故障处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49306888/