iphone - IOS - RESTKIT - 多种方式映射结果

标签 iphone ios restkit object-object-mapping

我是 ios/RESTKIT 的新手。我正在尝试使用 RESTKIT 从 ios 设备使用 web 服务。 json 返回可能有 2 种可能的结果。

A)失败时,json 结果如下所示(结果是一个字符串“null”。错误代码可用):

{
    status: false,
    result: null
    error: NO_SUCH_USER
}

(A) 的映射

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[WsReturn class]];
    [mapping mapKeyPath:@"result" toAttribute:@"result"];
    [mapping mapKeyPath:@"status" toAttribute:@"status"];
    [mapping mapKeyPath:@"error" toAttribute:@"error"];
    [objectManager.mappingProvider setMapping:mapping forKeyPath:@"/"];

B)成功时,它看起来像(结果是一个“复杂对象”。错误代码为空):

{
    status: true,
    result: {   
       name: "Some User",
       tasks: [
            {
              name: "Some Task1",
              taskId: 10
            },
            {
              name: "Some Task2",
              taskId: 20
            }
       ]
    },
    error: null
}

(B) 的映射

RKObjectMapping* taskMapping = [RKObjectMapping mappingForClass:[Task class]];
    [taskMapping mapKeyPath:@"name" toAttribute:@"name"];
    [taskMapping mapKeyPath:@"taskId" toAttribute:@"taskId"];
    [objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"tasks"]; 

RKObjectMapping* resultMapping = [RKObjectMapping mappingForClass:[Result class]];
    [resultMapping mapKeyPath:@"name" toAttribute:@"name"];
    [resultMapping mapRelationship:@"tasks" withMapping:taskMapping];
    [objectManager.mappingProvider setMapping:resultMapping forKeyPath:@"result"];

RKObjectMapping* cmplxMapng = [RKObjectMapping mappingForClass:[WsReturn class]];
    [cmplxMapng mapKeyPath:@"status" toAttribute:@"status"];
    [cmplxMapng mapKeyPath:@"error" toAttribute:@"error"];
    [cmplxMapng mapRelationship:@"result" withMapping:resultMapping];
    [objectManager.mappingProvider setMapping:cmplxMapng forKeyPath:@"/"];

问题

1) (A) 工作正常。 (乙) 没有。你能提供一些指导吗?

2) 对于相同的网络服务调用,“结果”部分可以是字符串(null)或复杂对象。那么我该如何在代码中处理呢?我传递哪个映射?映射或 cmplxMappng(更改名称以避免水平滚动)?

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/myUrl"
objectMapping:HOW_TO_DECIDE_WHICH_MAPPING_TO_PASS_HERE delegate:self];

我相信这是一个常见的场景。我搜索过,但找不到相关示例。也许我看错地方了。关于如何处理此问题的想法/指示会有所帮助。谢谢。

最佳答案

我就是这样解决的-

1) 我替换了这一行:

[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"tasks"];    

有了这个:(KeyPath 的注意事项)

[objectManager.mappingProvider setMapping:uooMapping forKeyPath:@"result.tasks"]; 

2) 已关注此主题 http://groups.google.com/group/restkit/browse_thread/thread/89b25b3f0f7e0177 & 按照 Blake 的建议添加了这一行:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.3]]; 

就在调用 loadObjectsAtResourcePath 之前

3) 至于以不同方式映射对象,我发现传递 cmplxMapng 似乎总是有效。

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/myUrl"     
                                 objectMapping:cmplxMapng delegate:self];

因此,如果“结果”部分作为字符串“null”返回,我会得到“(null)”结果和“状态”和“错误”字段被正确映射。有效!

希望这对某人有帮助。

关于iphone - IOS - RESTKIT - 多种方式映射结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8449496/

相关文章:

ios - 在 RestKit 中使用请求特定的 HTTP header

iphone - Xcode——将一个静态库嵌入到另一个静态库中?

iphone - 使用按钮更改页面控件

ios - 警报 View 内的警报 View

objective-c - 在 RestKit 中序列化嵌套图像(Rails 后端)

json - 使用 Restkit 和错误 : No strategy for transforming from '__NSArrayI' to 'NSString' 映射 JSON 数组

iphone - shouldAutorotate To InterfaceOrientation 在通用应用程序中不起作用

iphone - Root View Controller

iOS 5 : Error merging 3 videos with AVAssetExportSession

objective-c - 存储 UILocalNotification 以便于处理