如何在RestKit GET期间优雅地处理(预期的)nil密钥路径?
当我进行getAllEvents API调用时,如果用户没有任何事件,API将在有效负载中返回空值,例如{"events":null}
。 null值会导致调用RestKit request: didFailLoadWithError
和objectLoader: didFailWithError
方法,我不一定要这样做,因为这是有0个事件的预期行为。它提供的错误消息是Could not find an object mapping for keyPath: ''
。
我可以在映射配置和/或委托方法中处理这个,或者我是否需要修改API,可能返回空字符串而不是null。当列表为空时,JSON应该返回什么标准?
答案 0 :(得分:2)
当列表为空时,JSON应该返回什么标准?
我不知道真的,但我会选择一个空阵列:
{ 'events' : [] }
如果某个值为null,我根本不会发送它[节省带宽]。
答案 1 :(得分: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];
}