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

Posted

技术标签:

【中文标题】IOS - RESTKIT - 以多种方式映射结果【英文标题】:IOS - RESTKIT - mapping result in multiple ways 【发布时间】:2012-01-16 23:33:57 【问题描述】:

我是 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) 工作正常。 (B) 没有。能否指点一下?

2) 对于同一个 Web 服务调用,“结果”部分可以是字符串(null)或复杂对象。那么如何在代码中处理这个问题呢?我要通过哪个映射?映射或 cmplxMapng(名称已更改以避免水平滚动)?

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

我相信这是一种常见的情况。我搜索了,但找不到相关的例子。也许我看错了地方。关于如何解决这个问题的想法/指针将有所帮助。谢谢。

【问题讨论】:

如果我的回答对你有帮助,请告诉我,如果有用,请采纳! 这个问题仍然悬而未决。任何指针都会有所帮助。谢谢! 【参考方案1】:

所以我就是这样解决的-

1) 我替换了这一行:

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

用这个:(注意 forKeyPath)

[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)”作为结果,“状态”和“错误”字段映射正确。有效!

希望这对某人有所帮助。

【讨论】:

以上是关于IOS - RESTKIT - 以多种方式映射结果的主要内容,如果未能解决你的问题,请参考以下文章

RestKit:当值无效时如何拒绝整个映射

无法使用 RestKit 处理成功的 204 响应并正确映射失败的响应

映射后向 RestKit 映射结果字典添加值

使用 RESTKit 映射 iTunes 搜索 API 结果

iOS RestKit 实体管理器映射对象数组

RestKit 的动态映射会解决这个复杂的 JSON 映射吗?