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 处理成功的 204 响应并正确映射失败的响应