2014-03-25 2 views
0

restkit에서 매핑을 서로 종속시킬 수 있습니까? 어레이 IDLIST & 사람에 드릴 위해Restkit 매핑 종속성

{ 
    "IdList": [ 
     "1", 
     "2", 
     "3", 
     "4", 
     "5", 
     "6", 
     "7", 
     "8", 
     "9", 
     "10" 
    ], 
    “Persons”: [ 
     { 
      "Id": 2, 
      "Name": “James”, 
      "Description": “Tall”, 
      "Items": [ 
       { 
        "Id": 1051, 
        "Name": “Hat”, 
        "Description": "", 
        “Accesories”: [] 
       } 
      ] 
     } 
    ] 
} 

I 2 응답 디스크립터가 : I는 다음 JSON 구조를 갖는다.

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[MappingProvider personsMapping] method:RKRequestMethodGET pathPattern:nil keyPath:@"Persons"statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[self addResponseDescriptor:responseDescriptor]; 

RKResponseDescriptor *IdsResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[MappingProvider IdsMapping] method:RKRequestMethodGET pathPattern:nil keyPath:@"IdList" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[self addResponseDescriptor:IdsResponseDescriptor]; 

내 매핑 코드 :

+ (RKDynamicMapping *)IdsMapping { 

    RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Ids" inManagedObjectStore:[[CoreDataManager sharedInstance] objectStore]]; 

    mapping.discardsInvalidObjectsOnInsert = YES; 

    [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"theId"]]; 

    RKDynamicMapping *idsMapping = [RKDynamicMapping new]; 

    [dynamicTableIdsMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) { 

     if (!representation) { 

      return nil; 

     } else { 

      return mapping; 

     } 

     return nil; 

    }]; 

    return dynamicTableIdsMapping; 
} 

+ (RKDynamicMapping *)personsMapping { 

    RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Persons" inManagedObjectStore:[[CoreDataManager sharedInstance] objectStore]]; 

    mapping.assignsNilForMissingRelationships = YES; 
    mapping.assignsDefaultValueForMissingAttributes = YES; 
    mapping.discardsInvalidObjectsOnInsert = YES; 

    [mapping addAttributeMappingsFromDictionary:@{ 
     @"Id": @"remoteID", 
     @"Name": @"name" 
    }]; 

    mapping.identificationAttributes = @[ @"remoteID" ]; 

    [mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"Items" 
                        toKeyPath:@"products" 
                       withMapping:[MappingProvider itemsMapping]]]; 
    RKDynamicMapping * dynamicMenuMapping = [RKDynamicMapping new]; 


    [dynamicMenuMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) { 

     if (!representation) { 

      return nil; 

     } else { 

      NSArray *categoryArray = [representation valueForKey:@"Items"]; 

      if (!categoryArray || !categoryArray.count) { 

       return nil; 

      } else { 

       return mapping; 

      } 
     } 

     return nil; 

    }]; 

    return dynamicMenuMapping; 
} 

어떻게 먼저 사람 배열을 매핑 관리하고 IDLIST 것? 사람이 값을 포함하는 경우 idList 배열 만 매핑하면됩니다. 필자는 Person의 데이터가 존재할 때 사용자가 새로운 뷰에 대해서만 제시되고 idList에 대해서도 제시되므로이 작업을 원한다. 따라서 persons 배열이 비어있는 경우 IdList를 매핑하는 것이 nessasary가 아닙니다.

답변

1

nil 키 경로가있는 단일 응답 설명자를 사용해야합니다. 그 응답 서술자에 대한 매핑은 내용을 검사하고 두 하위 섹션 (컨테이너 클래스가 필요하므로) 또는 nil (매핑 프로세스를 포기하기)을 모두 처리하는 매핑을 반환하는 동적 매핑이됩니다.

+0

답장을 보내 주셔서 감사합니다. 내 컨테이너 수업이 무슨 뜻인지 정확히 모르겠다. 정교하게 주시겠습니까? 고맙습니다. – 7c9d6b001a87e497d6b96fbd4c6fdf

+0

당신이 물어 보는 것을하기 위해서는 1 개의 응답 기술자가 필요합니다. 자연스럽게 1 클래스 유형으로 매핑되지만 2 (중첩 된) 유형이 있습니다. 따라서 처리를 용이하게하기 위해 다른 클래스와 관계가있는 새 클래스를 만들어야합니다. – Wain

+0

매핑이 완료된 후 서버 응답을 변경하거나 일부 데이터 만 삭제하는 것이 더 간단 할 수 있습니다 ... – Wain