2015-08-06 2 views
1

Я возрождаю старый проект, который первоначально использовал RestKit 0.10, и теперь я использую RestKit 0.24. Старая версия по-прежнему работает, но, к сожалению, RestKit 0.10 не совместим с 64-битной версией и, следовательно, не отправляется в AppStore (и, безусловно, время для обновления).Как игнорировать пустые свойства размещенных объектов с помощью restkit

Я не могу получить объект для публикации правильно. В RestKit 0.10 свойства без значений не были отправлены на сервер, тогда как они выглядят в RestKit 0.20. Я попытался явно установить assignsDefaultValueForMissingAttributes на NO, но, похоже, это не имеет значения.

Сервер ожидает следующий формат:

{"response": {"assessment_id":"1","time_taken":"60"}, 
"answer": [ 
     {"question_number": 1, "answer_value": 3}, 
     {"question_number": 2, "answer_value": 2}, 
     {"question_number": 3, "answer_value": 1}, 
] 
} 

я поставил объект CompletedAssessment, который содержит Response объект и массив Answer объектов. (Обратите внимание, что, когда эти объекты получены с сервера, необходимо получить еще много свойств, чем нужно отправить).

@interface CompletedAssessment : NSObject { 
    Response *response; 
    NSArray *answers; 
} 

@interface Answer : NSObject { 
    NSNumber *identifier; 
    NSNumber *responseId; 
    NSNumber *questionNumber; 
    NSString *answerHistory; 
    NSString *answerValue; 
    NSString *answerText; 
    NSNumber *timeTaken; 
} 

@interface Response : NSObject { 
    NSNumber *identifier; 
    NSNumber *assessmentId; 
    NSNumber *timeTaken; 
    NSNumber *clientId; 
    NSString *assessmentShortName; 
    NSString *score; 
    NSString *interpretation; 
    NSString *dateCreated; 
    NSString *localTime; 

}

Я установил отображение следующим образом:

RKObjectMapping *answerMapping = [RKObjectMapping mappingForClass:[Answer class]]; 
answerMapping.assignsDefaultValueForMissingAttributes = NO; 

[answerMapping addAttributeMappingsFromDictionary:@{ 
                @"id": @"identifier", 
                @"response_id": @"responseId", 
                @"question_number": @"questionNumber", 
                @"answer_history": @"answerHistory", 
                @"answer_value": @"answerValue", 
                @"answer_text": @"answerText", 
                @"time_taken": @"timeTaken" 
                }]; 

RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[Response class]]; 
responseMapping.assignsDefaultValueForMissingAttributes = NO; 

[responseMapping addAttributeMappingsFromDictionary:@{ 
                @"id": @"identifier", 
                @"client_id": @"clientId", 
                @"assessment_id": @"assessmentId", 
                @"time_taken": @"timeTaken", 
                @"score": @"score", 
                @"assessment_short_name": @"assessmentShortName", 
                @"interpretation": @"interpretation", 
                @"created": @"dateCreated", 
                @"local_time": @"localTime" 
                }]; 

RKObjectMapping *completedAssessmentMapping = [RKObjectMapping mappingForClass:[CompletedAssessment class]]; 
completedAssessmentMapping.assignsDefaultValueForMissingAttributes = NO; 

[completedAssessmentMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"response" toKeyPath:@"response" withMapping:responseMapping]]; 
[completedAssessmentMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"answer" toKeyPath:@"answers" withMapping:answerMapping]]; 

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:completedAssessmentMapping method:RKRequestMethodGET pathPattern:nil keyPath:@"data.completedAssessment" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor]; 
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[completedAssessmentMapping inverseMapping] objectClass:[CompletedAssessment class] rootKeyPath:nil method:RKRequestMethodPOST]; 
[[RKObjectManager sharedManager] addRequestDescriptor:requestDescriptor]; 

[objectManager.router.routeSet addRoute:[RKRoute 
             routeWithClass:[CompletedAssessment class] 
             pathPattern:@"clients/:response.clientId/responses" 
             method:RKRequestMethodPOST]] ; 

Logging показывает конец JSON отображается в следующем формате:

{"response": 
    {"interpretation":null,"id":null,"score":null,"client_id":15,"local_time":"2015-8-6 13:8:34","time_taken":5,"assessment_short_name":null,"assessment_id":8,"created":null}, 
"answer":[ 
    {"answer_value":"0","id":null,"answer_text":null,"answer_history":null,"time_taken":null,"response_id":null,"question_number":1}, 
    {"answer_value":"1","id":null,"answer_text":null,"answer_history":null,"time_taken":null,"response_id":null,"question_number":2} 
]} 

И каротаж RestKit подтверждает нуль картографирование:

restkit.object_mapping:RKMappingOperation.m:873 Mapped relationship object from keyPath 'response' to 'response'. Value: { 
"assessment_id" = 8; 
"assessment_short_name" = "<null>"; 
"client_id" = 15; 
created = "<null>"; 
id = "<null>"; 
interpretation = "<null>"; 
"local_time" = "2015-8-6 13:8:34"; 
score = "<null>"; 
"time_taken" = 5; 
} 

restkit.object_mapping:RKMappingOperation.m:715 Mapped attribute value from keyPath 'identifier' to 'id'. Value: (null) 
... 

Пожалуйста, помогите!

ответ

0

Вы создаете новое отображение вызывающего [selfCompletedAssessmentMapping inverseMapping] в этой строке:

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[selfCompletedAssessmentMapping inverseMapping] objectClass:[CompletedAssessment class] rootKeyPath:nil method:RKRequestMethodPOST]; 

сохранить его в переменной и присвоить assignsDefaultValueForMissingAttributes к NO перед созданием дескриптора:

RKObjectMapping *requestMapping = [selfCompletedAssessmentMapping inverseMapping]; 
requestMapping.assignsDefaultValueForMissingAttributes = NO; 
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[CompletedAssessment class] rootKeyPath:nil method:RKRequestMethodPOST]; 
+2

Это дает тот же эффект, к сожалению, , RestKit регистрирует все атрибуты нулевого документа и ответ сервера одинаковый. – Tim

Смежные вопросы