【发布时间】:2012-08-21 00:06:12
【问题描述】:
我有时从服务器得到的响应是一个 JSON,代表一个像这样的空对象 {}
我已经阅读了this question/answer over here,其中指出我应该实现 willMapData 委托函数并将 *mappableData 指向其他地方。问题是我不知道应该为 *mappableData 分配什么,这样我的应用程序就不会崩溃。
我试过了
- (void)objectLoader:(RKObjectLoader *)loader willMapData:(inout id *)mappableData
{
id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:RKMIMETypeJSON];
*mappableData = [parser objectFromString:@"{\"unknownObject\":\"\"}" error:nil];
}
但是,我的应用程序崩溃了,而且非常生气
'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]
你能帮帮我吗?
更新 在控制台中打开 RKDebug 消息会给我这个:
Performing object mapping sourceObject: {
}
and targetObject: (null)
然后代码到达RKObjectMapper.m:
if (mappableData) {
id mappingResult = [self performMappingForObject:mappableData atKeyPath:@"" usingMapping:mappingsForContext];
foundMappable = YES;
results = [NSDictionary dictionaryWithObject:mappingResult forKey:@""];
}
但是那里的 mappingResult 返回 nil...所以当应用程序尝试使用 nil 对象创建 NSDictionary 时会崩溃。
【问题讨论】:
-
它在哪里崩溃?当您有空响应时,它不应该崩溃。
-
我更新了问题以显示崩溃的位置。我刚刚发现 Restkit 正在尝试将响应映射到 RKErrorMessage (这是正确的,因为我从服务器得到 404 )。我的 RKErrorMessage 映射声明了一个 "msg": keyPath... 所以如果我给解析器一个 @"{\"msg\":\"\"}" ,Restkit 不会崩溃。不过我觉得这不是一个很好的解决方案......
-
很容易修复,把 if(mappingResult) 放在结果设置之前
-
当然!问题是,这是 RestKit 模块的一部分!也许我会提交错误报告之类的......
标签: objective-c ios restkit