0

如何在 RestKit GET 期间优雅地处理(预期的)nil 密钥路径?

如果用户没有任何事件,当我调用 getAllEvents API 时,API 将在有效负载中返回一个空值,例如{"events":null}. null 值会导致调用 RestKitrequest: didFailLoadWithErrorobjectLoader: didFailWithError方法,我不一定想要,因为这是有 0 个事件的预期行为。它给出的错误信息是Could not find an object mapping for keyPath: ''.

我可以在映射配置和/或委托方法中处理这个问题,还是我需要修改 API,也许返回一个空字符串而不是 null。当列表为空时,JSON 应该返回什么标准?

4

2 回答 2

2

当列表为空时,JSON 应该返回什么标准?

实际上我不知道,但我会使用一个空数组:

{ 'events' : [] }

如果一个值为空,我根本不会发送它[节省带宽]。

编辑:也看到这个答案

于 2012-09-13T23:53:54.360 回答
1

更新:这不再适用于 RestKit v0.10.x。请参阅@moonwave99 的回答。

找到了解决方案!

我最终做了一些与 moonwave 的建议非常相似的事情,只是我现在将 null 对象更改为空数组。

- (void)objectLoader:(RKObjectLoader*)loader willMapData:(inout id *)mappableData {

  id events = [*mappableData objectForKey:@"events"];

  if (events == [NSNull null]) {
    NSLog(@"it's null");
    [*mappableData setObject:@"" forKey:@"events"];
  }
}

为了成功处理现在为空的非空数组,我必须告诉事件映射忽略未知的键路径。

[eventsMapping setIgnoreUnknownKeyPaths:YES];

现在,RestKit 不再调用 didFailWithError 委托方法,而是像我一直期望/希望的那样调用 didLoadObjects。从那里我可以在尝试分配给我的原生 Cocoa 对象之前检查数组是否为空。

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {

  if ([objects count] == 0) {

    // No events, alert user

  }
  else if ([[objects objectAtIndex:0] isKindOfClass:[Events class]]) {

    Events *events = [objects objectAtIndex:0];

}
于 2012-09-14T02:51:18.247 回答