RestKit 0.20.0-rc1 - 如何映射多个错误参数?

Posted

技术标签:

【中文标题】RestKit 0.20.0-rc1 - 如何映射多个错误参数?【英文标题】:RestKit 0.20.0-rc1 - How do I map multiple error parameters? 【发布时间】:2013-02-28 16:04:34 【问题描述】:

我目前正在使用 RKErrorMessage 类来映射来自我的服务器的错误消息,如下所示:

RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"message" toKeyPath:@"errorMessage"]];
RKResponseDescriptor *errorResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping
                                                                                            pathPattern:nil
                                                                                                keyPath:@"error"
                                                                                            statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)];

但现在我想从我的服务器映射一个附加参数,例如错误标题(或其他任何相关的内容)。我的 JSON 如下所示:


    "error":
        "title":"This is the error title"
        "message":"This is the error message",
    

这个想法是,如果我的应用程序访问服务器时出现问题,我可以直接将其中一些错误消息映射到 UIAlertViews。这可以通过 only 错误消息来完成,但添加标题似乎使其适合 UIAlertView。

通过查看 RKErrorMessage 类,我发现它只有两个参数:errorMessage 和 userInfo。我该怎么做呢?

更新:我尝试使用 RKErrorMessage 执行此操作的原因是它自动映射到传递到 RestKit get/post/put/etc 方法中的失败块的 NSError...这很不错。

[objectManager getObjectsAtPath:@"/api/somethingsomething/" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

     failure:^(RKObjectRequestOperation *operation, NSError *error) 

    ];

【问题讨论】:

我知道这不是你想要的......但根据我的经验,你应该尽量远离 RestKit。 这也是我的经验。不幸的是,我不知道这样做,所以我暂时被 RestKit 困住了。 【参考方案1】:

这是您最初提出的问题的一种方法(不确定您为什么接受并没有真正回答您的问题的答案):

RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"userInfo"]];
RKResponseDescriptor *errorResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errorMapping
                                                                                            pathPattern:nil
                                                                                                keyPath:@"error"
                                                                                            statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)];

与您的示例代码的主要区别在于这一行:

[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"userInfo"]];

然后,从故障块回调中,您可以访问 userInfo 字典,如下所示:

NSString *message = [[[[[error userInfo] objectForKey:RKObjectMapperErrorObjectsKey] objectAtIndex:0] userInfo] objectForKey:@"message"];
NSString *title = [[[[[error userInfo] objectForKey:RKObjectMapperErrorObjectsKey] objectAtIndex:0] userInfo] objectForKey:@"title"];

RestKit 会自动将 JSON 的“错误”字典的所有属性映射到 RKErrorMessage 的 userInfo 字典。

【讨论】:

啊,我知道你在那里做了什么。好想法。下次有机会我会试一试(虽然可能不会很快)。 是的,我必须做和你打算做的一模一样的事情,而我做到了。祝你好运。 在使用RKErrorMessage 类时,使用toKeyPath:@"userInfo" 添加属性映射不起作用。我不得不将目标键路径用作“errorMessage”。【参考方案2】:

你为什么用RKErrorMessage???

RKErrorMessage 是一个用于表示错误的简单类 由客户端使用的远程后端系统返回的消息 应用程序正在通信。

我认为最好的方法是创建自定义对象来映射您的参数。

@interface MyCustomErrorObject : NSObject

    @property (nonatomic, strong) NSString *title;
    @property (nonatomic, strong) NSString *message;

@end

【讨论】:

这一直是 B 计划。我试图避免这种情况,因为 RKErrorMessage 到 NSError 的映射很方便。查看更新。 @docksteaderluke 您能否详细说明此解决方案的实际含义。你能继续使用 getObjectsAtPath 吗?我遇到了同样的事情。我走上了一条 MyCustomErrorObject 式的路径,但我仍然看不到如何在失败块中获取该对象。 1.像这样映射错误: RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[MyCustomErrorObject class]]; 2. 添加响应描述符。 3.在failure block中获取错误对象:[error.userInfo objectForKey:RKObjectMapperErrorObjectsKey]

以上是关于RestKit 0.20.0-rc1 - 如何映射多个错误参数?的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.20.0 rc1 - 使用字符串数组创建请求帖子

RestKit 0.20.0-rc1 mappingResult 304 Not Modified后为空

Restkit 0.20.rc 需要但不包含多个 0.10 项

RestKit:你如何映射到 NSUUID?

RestKit映射成功后如何访问对象

如何使用 RestKit 映射根词典?