2012-09-13 88 views
0

如何在RestKit GET期間優雅地處理(預期)nil keypath?RestKit - 使用空值映射JSON響應/空數組

當我在用戶沒有任何事件時進行getAllEvents API調用時,API將在有效負載中返回空值,例如, {"events":null}。空值導致RestKit request: didFailLoadWithErrorobjectLoader: didFailWithError方法被調用,我不一定要這樣做,因爲這是0事件發生時的預期行爲。它給出的錯誤信息是Could not find an object mapping for keyPath: ''

我可以在映射配置和/或委託方法中處理這個問題,還是需要修改API,可能返回空字符串而不是null。當列表爲空時,JSON應該返回什麼標準?

回答

2

當列表爲空時,JSON應該返回什麼標準嗎?

我不知道actualy,但我有一個空數組去:

{ 'events' : [] } 

如果值爲空,我只是不發送它在所有[節省帶寬。

編輯:see this answer too

1

更新:這不再超越RestKit v0.10.x.看@ moonwave99的答案。

找到解決方案!

我最終做了一些非常類似於moonwave的建議,除了我現在將空對象更改爲空數組。

- (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]; 

的不是調用didFailWithError委託方法現在,RestKit調用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]; 

}