2013-07-09 115 views
0

我從WS得到這樣一個JSON文件:Restkit動態映射爲可選屬性

{ 
    ... 
    error=true, 
    errorMsg="xyz", 
    errorCode="1234" 
} 

但這些屬性都是可選的,所以有時它們的存在和有時他們沒有。

我加了一個動態映射只讀取錯誤 - 只有當錯誤被設置爲true

之一:如果錯誤= TRUE

[dynamicMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"error" expectedValue:[NSNumber numberWithInt:1] objectMapping:errorMapping]]; 

[dynamicMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) { 
     if ([[representation valueForKey:@"error"] isEqualToNumber:[NSNumber numberWithInt:1]]) { 
      return errorMapping; 
     } 

     return nil; 
    }]; 

一切正常但如果錯誤屬性丟失,我會收到警告:

restkit.object_mapping:RKMapperOperation.m:98 Adding mapping error: Could not find an object mapping for keyPath: '<null>' 

我只是想擺脫警告。這個問題的最佳做法是什麼?如何將該屬性標記爲可選?

+0

你使用這個和另一個映射嗎? – Wain

+0

嗨,是的,我使用與狀態碼RKStatusCodeClassServerError = 500的服務器錯誤相同的映射(「errorMapping」)。因此,如果服務器上發生錯誤,服務器將以json格式發送錯誤消息。 – jeven

+0

我的意思是你的成功方案如何處理?通常你的動態映射會檢查狀態,然後返回錯誤映射或成功映射。 – Wain

回答

0

要刪除警告,您需要完成映射配置,因爲目前您只能爲其中一半場景提供信息。警告就是這個警告。它可能是功能性的,這就是爲什麼它不是一個斷言。

所以,你處理錯誤的情況下,只需添加另一個檢查,是這樣的:

[dynamicMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) { 
    NSNumber *errorNumber = [representation valueForKey:@"error"]; 

    if (errorNumber == nil) { 
     return successMapping; 
    } else if ([errorNumber isEqualToNumber:[NSNumber numberWithInt:1]]) { 
     return errorMapping; 
    } 

    return warningMapping; 
}]; 

而且,你不侷限於只確認了「錯誤」的參數。您可以檢查響應中的任何其他鍵和值,包括存在和值。

+0

問題是我註冊了關鍵路徑「people」的成功映射,所以我的成功json可能如下所示:{people:[..],error = false,...}錯誤動態映射因此被註冊爲keypath nil – jeven