从NSError中获取部分错误

3

在使用CloudKit时,有时会返回错误PartialFailure,这可能是由于重复的订阅等原因引起的。参见下面的示例。

<CKError 0x7f8318711520: "Partial Failure" (2/1011); 
"Failed to modify some subscriptions"; uuid = A434B010-7650-4BBA-8A7A-33CD0690FD15; 
container ID = "iCloud.xxx.xxx"; partial errors: { 
EFC65F4A-A595-44A3-A022-323D9CE9B535 = <CKError 0x7f831a007be0: "Server Rejected Request" (15/2032); server message = "subscription is duplicate of '_930081460_AA87A676-DE57-4530-8BB8-7465BF4F4303'"> 
C4913907-28F3-42DB-8455-9966D9084834 = <CKError 0x7f83185cfc20: "Server Rejected Request" (15/2032); server message = "subscription is duplicate of '_930081460_F92FA91D-3E92-4E46-AE59-E912F8871026'"> }>

我希望能够从主错误对象中检索这些部分错误,但我不知道如何做。`NSError`没有`partialError`属性,也没有在`userInfo`中检索它的关键字

3
如果您的问题可能适用于Swift或Objective-C,那么很可能不应该使用这两个标签中的任何一个。 - Matt Gibson
2个回答

3
您没有得到一个直接的NSError,而是得到了一个CKError。查看CKError的文档,实际上有一个CKPartialErrorsByItemIDKey键。如果您问我,这看起来像是一个按项目ID为键返回CKError字典的关键。userInfo对象应该包含该键。另外在此处有记录:CloudKit Framework Constants Reference

实际上,CKError并不是一个,而只是CloudKit的一个子框架,其中包含所有相关的NSError补充。 - Ben Lu
你有 #import <CloudKit/CloudKit.h> 吗?我在 Xcode 6 beta 4 中看到了自动补全。 - Acey
好的观点。错误域是CKErrorDomain值,但它仅仅是一个NSError类型,可以说是公平的。 - Acey
@Jonny 不确定你从哪里获取这些信息,但是CloudKit框架在Swift或Objective-C上都可以完全兼容。 - Acey
@Jonny 是的,你说得对。我需要更仔细地阅读,显然在评论区上方我三年前就有过同样的对话。 - Acey
显示剩余2条评论

2

两年过去了,我仍然认为如何访问部分错误并没有特别好的文档记录。感谢 @Acey 用 CKPartialErrorsByItemIDKey 指引了我正确的方向。

对于那些正在苦苦挣扎的人,这里有一个例子,展示了我如何在 CKModifySubscriptionsOperation(Swift 2.2)中访问部分错误:

someZoneSubscriptionOperation.modifySubscriptionsCompletionBlock = {(savedSubscriptions: [CKSubscription]?, deletedSubscriptionIDs:[String]?, operationError:NSError?) in

    // check specifically for an error in changing subscriptions to custom zone with specific subscriptionID
    if let partialError = operationError?.userInfo[CKPartialErrorsByItemIDKey]?[subscriptionID] as? ErrorType {
        print(partialError)         // prints partial error for custom zone with `subscriptionID` if it exists
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接