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

Rav*_*avi 3 iphone object-object-mapping ios restkit

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

A)失败时,json结果如下所示(结果是字符串"null".错误代码可用):

{
    status: false,
    result: null
    error: NO_SUCH_USER
}
Run Code Online (Sandbox Code Playgroud)

(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:@"/"];
Run Code Online (Sandbox Code Playgroud)

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

{
    status: true,
    result: {   
       name: "Some User",
       tasks: [
            {
              name: "Some Task1",
              taskId: 10
            },
            {
              name: "Some Task2",
              taskId: 20
            }
       ]
    },
    error: null
}
Run Code Online (Sandbox Code Playgroud)

(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:@"/"];
Run Code Online (Sandbox Code Playgroud)

问题

1)(A)工作正常.(B)没有.你能提供一些指示吗?

2)对于相同的webservice调用,"result"部分可以是字符串(null)或复杂对象.那么如何在代码中处理这个呢?我通过哪种映射?map或cmplxMapng(名称已更改,以避免horozontal滚动)?

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

我相信这是一种常见的情况.我搜索过,但找不到相关的例子.也许我看错了地方.关于如何处理这个的想法/指示将有所帮助.谢谢.

Rav*_*avi 5

所以这就是我解决它的方式 -

1)我替换了这一行:

[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"tasks"];    
Run Code Online (Sandbox Code Playgroud)

用这个:(通知forKeyPath)

[objectManager.mappingProvider setMapping:uooMapping forKeyPath:@"result.tasks"]; 
Run Code Online (Sandbox Code Playgroud)

2)按照此主题http://groups.google.com/group/restkit/browse_thread/thread/89b25b3f0f7e0177并按照Blake的建议添加此行:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.3]]; 
Run Code Online (Sandbox Code Playgroud)

调用loadObjectsAtResourcePath 之前

3)至于以不同方式映射对象,我发现传递cmplxMapng似乎总是起作用.

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/myUrl"     
                                 objectMapping:cmplxMapng delegate:self];
Run Code Online (Sandbox Code Playgroud)

因此,如果"结果"部分以字符串"null"返回,我得到"(null)"结果&"status"和"error"字段被正确映射.作品!

希望这有助于某人.