내 프로젝트에서 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);
}];
답변보기 http://stackoverflow.com/questions/18324033/map-url-parameters-to-objects-using-restkit – Wain
나는 당신의 제안을 시도했지만 아직도 운이 없다. 내 편집을 들여다 볼 수 있니? –
얼마나 자주'addRoute'를 호출합니까? 앱을 시작할 때 한 번만 모든 경로와 매핑을 설정하고 반복적으로 수행하지 말아야합니다. – Wain