2015-01-06 4 views
0

내 응용 프로그램이 JSON-RPC 프로토콜을 사용하여 백엔드와 통신합니다. 기본적으로 개체를 가져 와서 핵심 데이터에 직접 저장하는 것입니다. 여러 종류의 엔티티가 있습니다. 예를 들어 보겠습니다. 이벤트팟 캐스트. 두 엔티티에 대한 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

데이터 유형을 알려주는 응답이 있습니까? – Wain

+0

정말로 (제 편집 참조). 다른 응답을'data' 배열의 일부 매개 변수의 이름과 구별 할 수있는 유일한 것입니다. –

답변

1

유일한 쉬운 해결책은 동적 매핑을 사용하여 응답의 데이터를 검사하고 올바른 매핑을 선택하는 것입니다 (따라서이 동적 매핑을 가리키는 단일 응답 설명자를 갖게됩니다).

@metadata를 통해 매핑하는 동안 매개 변수를 사용할 수 있지만이 경우에는 도움이되지 않습니다. 실제로는 동일한 엔터티의 여러 유형을 구분하는 것입니다.

동적 매핑 옵션 또는 응답 설명자 선택에 매개 변수를 사용할 수 없습니다. RestKit에서 이것을 구현하는 것을 고려해 볼 수 있습니다. 반드시 사소한 것은 아닙니다.

+0

이 경우 동적 매핑을 사용하는 방법을 보여 주시겠습니까?나는 그 원리에 익숙하지 않다. –

+1

http://restkit.org/api/latest/Classes/RKDynamicMapping.html에서 간단한 예제와 클래스 문서 – Wain

+0

을 찾아 주셔서 감사합니다. Dynamic Mapping에서 잘 작동합니다. 건배 –

관련 문제