2015-01-06 44 views
0

我的應用程序使用協議JSON-RPC與後端進行通信。我基本上想要做的是獲取對象並將它們直接存儲在Core Data中。我有多種類型的實體。我們舉個例子:活動播客。我通過在兩個實體的POST請求下在同一終端點擊API來獲取它們。唯一的改變是PARAMS:取決於請求參數的地圖資源

對於事件:

{ 
    id = 0; 
    jsonrpc = "2.0"; 
    method = "Events.Event.list"; 
    params =  { 
     location =   { 
      type = token; 
      value = haHssQWR0V8d; 
     }; 
     sessionId = v1oCLGlfxIvqYxhaHssQWR0V8dkFeS1JUqlF; 
     week = "2014_42"; 
    }; 
} 

對於播客:

{ 
    id = 1; 
    jsonrpc = "2.0"; 
    method = "Podcasts.Podcast.list"; 
    params =  { 
     sessionId = v1oCLGlfxIvqYxhaHssQWR0V8dkFeS1JUqlF; 
    }; 
} 

我目前正在創建響應描述符,就像每一個實體映射這個。

+ (void)configureAllObjectsMapping 
{ 
    [self mapEvent]; 
    [self mapPodcast]; 
} 

+ (RKEntityMapping *)mapEvent 
{ 
    if (_eventMapping) { 
     return _eventMapping; 
    } 

    _eventMapping = [self mappingForClass:[Event class]]; 
    _eventMapping.identificationAttributes = @[CoreDataPrimaryKey]; 
    [_eventMapping addAttributeMappingsFromDictionary:@{ 
                 @"token":@"token", 
                 @"name":@"name", 
                 @"urlWeb":@"urlWeb", 
                 @"urlImage":@"urlImage", 
                 @"startsAt":@"startsAt", 
                 @"endsAt":@"endsAt", 
                 @"costs":@"costs", 
                 @"description":@"desc", 
                 @"genres":@"genres", 
                 @"artists.isSecret":@"hasSecretArtist", 
                 @"hasGuestlist":@"hasGuestlist", 
                 @"countGoings":@"countGoings" 
                 }]; 

    [_eventMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"venue" 
                        toKeyPath:@"venue" 
                       withMapping:[self mapVenue]]]; 

    [_eventMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"artists.data" 
                        toKeyPath:@"artists" 
                       withMapping:[self mapArtist]]]; 

    RKResponseDescriptor *list = [RKResponseDescriptor responseDescriptorWithMapping:_eventMapping 
                       method:RKRequestMethodPOST 
                     pathPattern:nil 
                      keyPath:@"result.data" 
                     statusCodes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(RKStatusCodeClassSuccessful, 104)]]; 

    [[APIManager sharedInstance].manager addResponseDescriptor:list]; 

    return _eventMapping; 
} 

+ (RKEntityMapping *)mapPodcast 
{ 
    if (_podcastMapping) { 
     return _podcastMapping; 
    } 

    _podcastMapping = [self mappingForClass:[Podcast class]]; 
    _podcastMapping.identificationAttributes = @[CoreDataPrimaryKey]; 
    [_podcastMapping addAttributeMappingsFromDictionary:@{ 
                 @"token":@"token", 
                 @"name":@"name", 
                 @"urlWeb":@"urlWeb", 
                 @"urlImage":@"urlImage", 
                 @"description":@"desc", 
                 @"duration":@"duration", 
                 @"playCount":@"playCount" 
                 }]; 

    RKResponseDescriptor *list = [RKResponseDescriptor responseDescriptorWithMapping:_podcastMapping 
                       method:RKRequestMethodPOST 
                     pathPattern:nil 
                      keyPath:@"result.data" 
                     statusCodes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(RKStatusCodeClassSuccessful, 104)]]; 

    [[APIManager sharedInstance].manager addResponseDescriptor:list]; 

    return _podcastMapping; 
} 

的問題是,無論對於播客和事件實體響應描述符是相同的,因爲pathPattern是零。

所以我從後端接收一切目前被認爲是播客因爲mapPodcast方法是mapEvent方法後調用。

有誰知道一種方法來區分兩個響應並將每個請求的響應映射到正確的實體嗎?

UPDATE:響應

這是樣的反應,我得到了我的資源:

事件

{ 
    "jsonrpc": "2.0", 
    "id": "1", 
    "result": { 
    "count": 1, 
    "data": [ 
     { 
     "token": "YAXDMJG17GRO", 
     "event_name": "Klubnacht | Fachwerk Nacht", 
     ... 
     } 
    ] 
    } 
} 

播客

{ 
    "jsonrpc": "2.0", 
    "id": "1", 
    "result": { 
    "count": 1, 
    "data": [ 
     { 
     "token": "G17GROYAXDMJ", 
     "podcast_name": "Podcast #19", 
     ... 
     } 
    ] 
    } 
} 

所以沒有事件可以區分它們,除了一些參數名稱。

+0

yhe響應中是否有任何內容告訴您數據類型? – Wain

+0

不是真的(請參閱我的編輯)。唯一可以將不同的響應區分爲'data'數組中某些參數的名稱。 –

回答

1

您唯一簡單的解決方案是使用動態映射來檢查響應中的數據並選擇正確的映射(這樣您將有一個指向此動態映射的單個響應描述符)。

您可以在通過@metadata進行映射時使用參數,但這在這種情況下無助於您,它實際上是用於區分不同類型的相同實體。

此時您不能使用動態映射選擇或響應描述符選擇的參數。你可以考慮在RestKit中實現它,它不一定是微不足道的。

+0

您可以向我展示在這種情況下如何使用動態映射。我對這個原則不是很熟悉。 –

+1

查看http://restkit.org/api/latest/Classes/RKDynamicMapping.html,其中有一個簡單的示例和類文檔 – Wain

+0

感謝您的幫助。它現在與動態映射工作正常。乾杯 –