2016-06-21 6 views
0

내 프로젝트에서 RestKit 0.2 버전을 사용하고 있습니다. 나는 응답을 이미 저장된 부모 엔티티에 매핑해야하는 상황이 있습니다.Restkit 부모에게 응답을 매핑합니다. Entity - 응답에 상위 엔티티 값이없는 경우

내 부모 클래스는 대화입니다. & 대화에 많은 메시지가있을 수 있습니다.

먼저 Coredata의 모든 대화를 대화 엔티티에 저장하고 있습니다.

그런 다음 특정 대화와 관련된 모든 메시지를 가져 오기 위해이 URL을 호출했습니다.

http://myUrl/conversations/bdc34e2a-fa1f-4dbe-83b4-3296ff657e93/messages

bdc34e2a-fa1f-4dbe-83b4-3296ff657e93 여기 내 JSON 응답 내 대화 ID

입니다.

[ 
{ 
    "id":"5f67f6f5-934d-403e-ac64-19dbd4defeda", 
    "sent_at":"2016-06-08T12:24:28+0000", 
    "read_at":null, 
    "sender":{ }, 
    "content":"test message", 
    "attachment":{ } 
}, 
{ 
    "id":"c4d18b33-4c54-4e7e-a964-a5cedc087122", 
    "sent_at":"2016-06-08T09:59:41+0000", 
    "read_at":null, 
    "sender":{ }, 
    "content":"abc test message", 
    "attachment":{ } 
}, 

내 Json 응답에는 대화 속성이 없지만 모든 대화를 관련 대화 아래에 매핑해야합니다.

RKEntityMapping *messageMapping = [RKEntityMapping mappingForEntityForName:[Message entityName] inManagedObjectStore:[[DataStoreManager sharedManager] managedObjectStore]]; 

[messageMapping addAttributeMappingsFromDictionary:@{ 
                @"id":@"identifier", 
                @"sent_at": @"date", 
                @"content": @"message", 

                }]; 

messageMapping.identificationAttributes = @[@"identifier"]; 

나는 대화에 메시지를 하나 개 관계에 많은 있습니다.

[messageMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:nil toKeyPath:@"conversation" withMapping:**conversationMapping**]]; 

하지만 어떻게 대화 매핑을 만들 수 있습니까?

편집 - & 메타 데이터

@Wain 제안으로 라우팅과 노력, 여기

// conversation mapping 
RKEntityMapping *conversationMapping = [RKEntityMapping mappingForEntityForName:[Conversation entityName] inManagedObjectStore:[[BADataStoreManager sharedManager] managedObjectStore]]; 

[conversationMapping addAttributeMappingsFromDictionary:@{ 
                  @"@metadata.routing.parameters.identifier": @"identifier" 

                  }]; 


conversationMapping.identificationAttributes = @[@"identifier"]; 

[messageMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:nil toKeyPath:@"messages" withMapping:conversationMapping]]; 

라우팅 restkit를 사용하여 노력하고있어 내 응답 디스크립터

입니다
RKResponseDescriptor *conversationDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[EntityMappingProvider messagesResponseMapping] method:RKRequestMethodAny pathPattern:@"/conversations/:identifier/messages" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

[[DataStoreManager sharedManager].router.routeSet addRoute:[RKRoute routeWithName:@"conversations" pathPattern:@"/conversations/:identifier/messages" method:RKRequestMethodGET]]; 

[[DataStoreManager sharedManager] addResponseDescriptor:conversationDescriptor]; 

[[DataStoreManager sharedManager] getObjectsAtPathForRouteNamed:@"conversations" object:conversation parameters:nil 
                 success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
                  RKLogInfo(@"response %@",mappingResult); 
                 } 

                 failure:^(RKObjectRequestOperation *operation, NSError *error) { 
                  RKLogInfo(@"error response %@", error.localizedDescription); 
                 }]; 

개체 : 대화 목록에서 대화를 하나 선택하면 대화이 전송됩니다.

하지만 대화가 메시지에 올바르게 매핑되지 않았습니다.

&이 메서드는 한 번만 호출 할 수 있습니다. 다음 오류가 발생합니다.

이유 : '기존 경로와 이름이 같은 경로를 추가 할 수 없습니다.'

하지만 모든 대화에 사용할 수 있어야하며 사용자가 대화를 선택할 때마다이 메서드가 호출됩니다.

나는 대화에 매핑 메시지 전에 대화를 & 사용자를 매핑하는 응답 디스크립터를 사용했다

솔루션. 따라서 대화의 메시지에 대한 응답 설명자를 사용했을 때 이전에 정의 된 설명자에 매핑되었습니다.

그래서 나는 & 사용이 여러 번 getObjectsAtPathForRouteNamed 일단 내가 모든 응답 디스크립터를 초기화 한 @Wain 설명으로 다음은 올바르게 매핑, 응답 디스크립터를 지정 pathPattern에게 &를 사용했다.

마지막으로 여기 당신이 대화 ID를 삽입 할 경로 패턴을 사용할 수 있도록 당신은 정말 경로를 사용해야 응답 디스크립터

// conversation mapping 
RKEntityMapping *conversationMapping = [RKEntityMapping mappingForEntityForName:[Conversation entityName] inManagedObjectStore:[[BADataStoreManager sharedManager] managedObjectStore]]; 
[conversationMapping addAttributeMappingsFromDictionary:@{ 
                  @"@metadata.routing.parameters.identifier": @"identifier" 

                  }]; 
conversationMapping.identificationAttributes = @[@"identifier"]; 
[messageMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:nil toKeyPath:@"messages" withMapping:conversationMapping]]; 

// Response descriptor 
RKResponseDescriptor *conversationDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[EntityMappingProvider messagesResponseMapping] method:RKRequestMethodAny pathPattern:@"/conversations/:identifier/messages" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[[DataStoreManager sharedManager].router.routeSet addRoute:[RKRoute routeWithName:@"conversations" pathPattern:@"/conversations/:identifier/messages" method:RKRequestMethodGET]]; 
[[DataStoreManager sharedManager] addResponseDescriptor:conversationDescriptor]; 
[[DataStoreManager sharedManager] getObjectsAtPathForRouteNamed:@"conversations" object:conversation parameters:nil 
                 success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
                  RKLogInfo(@"response %@",mappingResult); 
                 } 
                   failure:^(RKObjectRequestOperation *operation, NSError *error) { 
                  RKLogInfo(@"error response %@", error.localizedDescription); 
                 }]; 

답변

1

의 내 대화 매핑 &입니다. 그런 다음 매핑 메타 데이터를 사용하여 매핑의 id 값에 액세스하고이를 사용하여 적절한 객체에 연결할 수 있습니다.

+0

답변보기 http://stackoverflow.com/questions/18324033/map-url-parameters-to-objects-using-restkit – Wain

+0

나는 당신의 제안을 시도했지만 아직도 운이 없다. 내 편집을 들여다 볼 수 있니? –

+0

얼마나 자주'addRoute'를 호출합니까? 앱을 시작할 때 한 번만 모든 경로와 매핑을 설정하고 반복적으로 수행하지 말아야합니다. – Wain