【问题标题】:How to deal with an empty object {} in RestKit如何处理 RestKit 中的空对象 {}
【发布时间】: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


【解决方案1】:

将作业分成两行。

SomeDataType *object =  [parser objectFromString:@"{\"unknownObject\":\"\"}" error:nil];

if(object){
  *mappableData = object;
}else{
  // You've got nil, do something with it
}

现在您可以检查 nil 值并采取适当的措施。该操作是什么取决于崩溃的上下文。

【讨论】:

  • 我不确定我是否解释得不够清楚或者我遗漏了一些东西,但事情是当 Restkit 试图反序列化空对象时,它崩溃了。我不知道崩溃的上下文是什么或如何防止崩溃!当我将 mappableData 分配给 [parser objectFromString:@"{\"unknownObject\":\"\"}" error:nil];是让 Restkit 失败而不崩溃……
  • 哦,我明白了。可能是 RestKit 的错误?在将输入字符串传递给 RestKit 之前,我可以建议对其进行搜索和替换?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2016-01-16
  • 2023-03-10
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2010-12-04
相关资源
最近更新 更多