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后为空