2013-11-28 3 views
1

하나 개의 요청에 두 개의 responseDescriptor에 대한지도는 JSON의 모습, 나에게 두 개의 데이터 일부를 제공이Restkit : 나는 요청을

{ 
    "banner_content": 
    [ 
     { 
      "activi_id":"1", 
      "activi_pic": 
     }, 
     { 
      "activi_id":"2", 
      "activi_pic": 
     }, 
    ], 
    "categories": 
    [ 
     {...}, 
     {...}, 
    ] 
} 

내가 데이터를 매핑 responseDescriptor을 쓸 때, 나는 정의해야합니다 발견 배열 및 categories 배열을 포함하는 모델 또는 다른 요청을 할 때 두 responseDescriptors 쓸 필요가, (RKMappingResult *)mappingResult 다음 두 개의 부분을 얻을 수 배열을 얻으려면 [mappingResult objectForKey:@"banner_content"][mappingResult objectForKey:@"categories"] 이상한 메시지입니다.

RCategory.m

@implementation RCategory 


+ (NSDictionary *)_mapping { 
    return @{@"title" : @"title"}; 
} 

+ (RKObjectMapping *)mapping { 

    // Setup our object mappings 
    RKObjectMapping *categoryMapping = [RKObjectMapping mappingForClass:[self class]]; 
    [categoryMapping addAttributeMappingsFromDictionary:[[self class] _mapping]]; 

    RKObjectMapping *itemMapping = [RCategoryItem mapping]; 

    RKRelationshipMapping* relationShipMapping = [RKRelationshipMapping  relationshipMappingFromKeyPath:@"content" 
                           toKeyPath:@"items" 
                         withMapping:itemMapping]; 
[categoryMapping addPropertyMapping:relationShipMapping]; 

    return categoryMapping; 
} 

@end 

파일 :

아래 내 코드 파일입니다 사람이 해결할 수있는 더 좋은 방법이 있나요 viewController.m

- (void)loadCategory { 
    // Load the object model via RestKit 
    RKObjectManager *objectManager = [RKObjectManager sharedManager]; 

    RKObjectMapping *categoryMapping = [RCategory mapping]; 

    RKResponseDescriptor *categoryResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:categoryMapping 
                         method:RKRequestMethodGET 
                        pathPattern:nil 
                         keyPath:@"category" 
                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

    RKObjectMapping *adsMapping = [RAd mapping]; 
    RKResponseDescriptor *adResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:adsMapping 
                           method:RKRequestMethodGET 
                          pathPattern:nil 
                           keyPath:@"banner_content" 
                          statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

    //** DO I MUST ADD TWO RESPONSE_DESCRIPTOR FOR ONE REQUEST??** 
    [objectManager addResponseDescriptor:categoryResponseDescriptor]; 
    [objectManager addResponseDescriptor:adResponseDescriptor]; 

    [objectManager getObjectsAtPath:RPATH(CATEGORY_PATH) 
        parameters:nil 
         success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
          NSArray* statuses = [mappingResult array]; 
          [self.categories addObjectsFromArray:statuses]; 
          if ([self isViewLoaded]) { 
           [self.tableView reloadData]; 
          } 
         } 
         failure:^(RKObjectRequestOperation *operation, NSError *error) { 
          UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                      message:[error localizedDescription] 
                      delegate:nil 
                    cancelButtonTitle:@"OK" 
                    otherButtonTitles:nil]; 
          [alert show]; 
          NSLog(@"Hit error: %@", error); 
         }]; 

} 

: RAd.m이

파일을 무시 내 문제? BTW 모델 클래스에 -mapping이라고 쓰고 있습니다. 내가 생각할 수있는 가장 쉽고 좋은 방법입니다. 매핑을 어떻게 작성하는지 알고 싶습니다.

답변

1

응답에 2 개의 논리적으로 분리 된 부분이 있으므로 2 개의 응답 설명자가 필요합니다. 이건 괜찮아. 핵심 데이터를 사용하는 경우 모든 객체가 컨텍스트에 저장되고 필요에 따라 객체를 가져올 수 있으므로 걱정하지 않아도됩니다. 객체 매핑을 사용하면 그룹화에 신경 쓰지 않으면 매핑 결과에서 모든 객체의 배열을 가져올 수 있습니다.

모델 개체가 반환 한 데이터에서 매핑을 만드는 것은 좋지만 대상 키당 하나의 소스 키만 가질 수 있기 때문에 제한됩니다. 다른 키와 같은 다른 키를 가진 동일한 객체에 대해 다른 응답을 할 때 (바라건대 그렇게하지는 않지만 모두 서버 API에 따라 다름) 어떻게 될까요?

+0

category와 banner_content 배열은 필자가 필요로하는 것이지만 래퍼 범주와 banner_content 인 경우 두 개의 rDescriptor가 필요하지 않다고 생각하지 않습니다. '매핑 만들기 모델 객체에 의해 반환 된 데이터는 괜찮습니다. ', 그것은 나의 의심이기도합니다. 어떻게 매핑을합니까? 새로운 ResponseDescriptor가 필요한 경우 MyModels.m에서 매핑을 작성합니다. 새 keypath를 새로 할당 할 수 있습니까? objectManager가 singeton이기 때문에 REQUEST 전에 항상 addResponseDescriptor가 필요하지 않습니다. ResponseDescriptors를 관리하는 방법은 무엇입니까? – aelam

+0

개인적으로 필자는 내 데이터 모델을 소유하고이 모델에 대한 액세스를 제어하는 ​​싱글 톤 (MyDataController)을 가지고 있습니다. 내 모델 객체 측면에서 인터페이스를 제공하고 가져 오기/편집/요청 방법을 제공합니다. 모든 매핑을 지정합니다. 종종 여러 개의 'RKObjectMapping' 인스턴스가 있습니다. – Wain

+0

Wain과 완전히 일치하며, 2 개의 응답 디스크립터가 있고 "keyPath"인수를 사용하여 매핑에 사용할 식별자를 지정하면이 경우 가장 좋은 해결책입니다. –

관련 문제