Я возрождаю старый проект, который первоначально использовал 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)
...
Пожалуйста, помогите!
Это дает тот же эффект, к сожалению, , RestKit регистрирует все атрибуты нулевого документа и ответ сервера одинаковый. – Tim