【问题标题】:How to map a nested array of complex objects with RestKit如何使用 RestKit 映射复杂对象的嵌套数组
【发布时间】:2015-11-23 11:44:36
【问题描述】:

我有一系列复杂的对象:

@interface IDAQuizResponse : NSObject

@property (nonatomic) IDACallResponse *result;
@property (nonatomic) NSString *appId;
@property (nonatomic) IDAQuiz *quiz;

@end


@interface IDAQuiz : NSObject

@property (nonatomic) int quizId;
@property (nonatomic) NSString *state;
@property (nonatomic) NSString *result;
@property (nonatomic) NSArray *questions;

@end

@interface IDAQuestion : NSObject

@property (nonatomic) int questionId;
@property (nonatomic) NSString *question;
@property (nonatomic) NSArray *choices;

@end

@interface IDAChoice : NSObject

@property (nonatomic) NSString *choice;

@end

我正在尝试使用 RestKit 映射它们:

RKObjectMapping* quizResponseMapping = [RKObjectMapping mappingForClass:[IDAQuizResponse class]];
    [quizResponseMapping addAttributeMappingsFromArray:@[ @"appId" ]];

    RKObjectMapping* callResponseMapping = [RKObjectMapping mappingForClass:[IDACallResponse class]];
    [callResponseMapping addAttributeMappingsFromArray:@[ @"httpStatusCode", @"messageCode", @"message", @"moreInfo" ]];
    [quizResponseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"result" toKeyPath:@"result" withMapping:callResponseMapping]];

    RKObjectMapping* quizMapping = [RKObjectMapping mappingForClass:[IDAQuiz class]];
    [quizMapping addAttributeMappingsFromArray:@[ @"quizId", @"state", @"result" ]];
    [quizResponseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"quiz" toKeyPath:@"quiz" withMapping:quizMapping]];

    RKObjectMapping* questionMapping = [RKObjectMapping mappingForClass:[IDAQuestion class]];
    [questionMapping addAttributeMappingsFromArray:@[ @"id", @"question" ]];
    [quizMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"questions" toKeyPath:@"questions" withMapping:questionMapping]];

    RKObjectMapping* choiceMapping = [RKObjectMapping mappingForClass:[IDAChoice class]];
    [choiceMapping addAttributeMappingsFromArray:@[ @"choice" ]];
    [questionMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"choices" toKeyPath:@"choices" withMapping:choiceMapping]];

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:quizResponseMapping method:RKRequestMethodAny pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    NSURL *URL = [NSURL URLWithString:<fancy_url>];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
    [request setHTTPMethod:@"POST"];
    RKObjectRequestOperation *objectRequestOperation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors: @[responseDescriptor]];
    [objectRequestOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        RKLogInfo(@"Successfully retrieved data");
        NSLog(@"Successfully retrieved data");
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        RKLogError(@"Operation failed with error: %@", error);
        NSLog(@"Operation failed with error: %@", error);
    }];
    [objectRequestOperation start];

一切都正确映射,直到我到达 IDAQuiz 类中的嵌套数组“问题”。它根据返回的数据返回正确数量的对象,但所有变量都是 nil(包括嵌套的“choices”数组)。如何使用 RestKit 映射复杂对象的嵌套数组?

更新:

2015-08-28 14:01:38.061 [4894:98833] E restkit.object_mapping:RKMappingOperation.m:682 将 keyPath 'question' 处的值转换为 'NSString' 类型的表示失败:错误域 = org。 restkit.RKValueTransformers.ErrorDomain Code=3002 "值转换失败

似乎映射器正在尝试将我的整个对象映射到一个 NSString 中,而不是使用我提供的映射值。

【问题讨论】:

    标签: ios objective-c mapping restkit


    【解决方案1】:

    通过 json 返回的数据对每个问题对象都有一个键:

    result": "GENERATED",
    "questions":[
    {
    "question":{
    

    我创建了一个带有单个属性 IDAQuestion *question 的包装器,并用它来映射。映射现已启动并运行。

    RKObjectMapping* quizResponseMapping = [RKObjectMapping mappingForClass:[IDAQuizResponse class]];
        [quizResponseMapping addAttributeMappingsFromArray:@[ @"appId" ]];
    
        RKObjectMapping* callResponseMapping = [RKObjectMapping mappingForClass:[IDACallResponse class]];
        [callResponseMapping addAttributeMappingsFromArray:@[ @"httpStatusCode", @"messageCode", @"message", @"moreInfo" ]];
        [quizResponseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"result" toKeyPath:@"result" withMapping:callResponseMapping]];
    
        RKObjectMapping* quizMapping = [RKObjectMapping mappingForClass:[IDAQuiz class]];
        [quizMapping addAttributeMappingsFromArray:@[ @"quizId", @"state", @"result" ]];
        [quizResponseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"quiz" toKeyPath:@"quiz" withMapping:quizMapping]];
    
        RKObjectMapping *questionWrapperMapping = [RKObjectMapping mappingForClass:[IDAQuestionWrapper class]];
        [quizMapping addRelationshipMappingWithSourceKeyPath:@"questions" mapping:questionWrapperMapping];
    
        RKObjectMapping* questionMapping = [RKObjectMapping mappingForClass:[IDAQuestion class]];
        [questionMapping addAttributeMappingsFromDictionary:@{
                                                              @"questionId": @"id",
                                                              @"question":@"question"
                                                              }];
        [questionWrapperMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"question" toKeyPath:@"question" withMapping:questionMapping]];
    
        RKObjectMapping* choiceMapping = [RKObjectMapping mappingForClass:[IDAChoice class]];
        [choiceMapping addAttributeMappingsFromArray:@[ @"choice" ]];
        [questionMapping addRelationshipMappingWithSourceKeyPath:@"choices" mapping: choiceMapping];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-07
      • 2014-12-30
      • 2012-04-02
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      相关资源
      最近更新 更多