【问题标题】:RestKit 0.20.0-rc1 - How do I map multiple error parameters?RestKit 0.20.0-rc1 - 如何映射多个错误参数?
【发布时间】: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 困住了。

标签: ios objective-c cocoa-touch cocoa 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]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2013-01-20
  • 1970-01-01
  • 2014-09-07
相关资源
最近更新 更多