我已经构建了基本的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这样的完整操作,如果这很重要?
提前致谢!
答案 0 :(得分:6)
在CloudKit中,您拥有便利API和批处理操作API。如果您只在应用中使用便捷API,则表示您一次添加/更新/获取/删除单个记录。因此,您永远不会获得CKErrorPartialFailure
,因为您不批量与iCloud Server进行通信。如果您在应用程序中仅使用Batch Operations API,那么您将获得CKErrorPartialFailure
。这是一个高级错误,实际上包含操作中包含的每个记录/区域/订阅的子错误(CKError实例)。
我同意你的观点,文件不清楚只会出现部分错误和什么不可能。加上两种情况都会发生什么。要回答这个问题,您可以采用一种简单的方法,假设在两种情况下都可能发生所有错误,或者通过找出每种错误的可能情况,您可以采用另一种更详细的方法。 对于第二种方法,我必须模拟不同的错误情况,并查看从iCloud Server获得的错误。请考虑以下几点:
CKInternalError, CKServerRejectedRequest, CKServiceUnavailable
CKBadContainer,CKMissingEntitlement,CKBadDatabase
CKIncompatibleVersion, CKRequestRateLimited, CKOperationCancelled, CKLimitExceeded, CKServerResponseLost, CKManagedAccountRestricted
CKBatchRequestFailed
。这只适用于原子CKOperations CKNotAuthenticated, CKNetworkUnavailable, CKNetworkFailure
。它们作为记录区域操作的部分错误出现,而它们作为记录操作的非部分错误出现。CKUserDeletedZone , CKZoneBusy
。例外:CKChangeTokenExpired
我在执行基于操作的呼叫时将其视为非部分错误。CKZoneNotFound
作为部分和非部分错误发生。如果您使用CKModifyRecordsOperation
上传到不存在的区域,则会出现部分错误。但是,如果您使用CKFetchRecordZoneChanges
从不存在的区域中获取,则会出现非部分错误。CKInvalidArguments
被提及为使用Batch Operations API时可能出现的部分错误之一。但是,我尝试了不同的错误方案(例如:在同一请求中创建/更新记录),并且它作为非部分错误发生。因此,为了安全起见,我可以处理部分和非部分错误。CKQuotaExceeded
作为非部分错误发生。我设法通过填充来自除照片之外的其他应用程序的数据的iCloud存储来重现该错误。备份将填充大部分存储空间,然后填写剩余的可用空间将不难。CKUnkownItem
作为非部分错误发生。使用批处理操作API时也会出现部分错误。