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];
我相信这是一种常见的情况.我搜索过,但找不到相关的例子.也许我看错了地方.关于如何处理这个的想法/指示将有所帮助.谢谢.
所以这就是我解决它的方式 -
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"字段被正确映射.作品!
希望这有助于某人.
| 归档时间: |
|
| 查看次数: |
2034 次 |
| 最近记录: |