【问题标题】:RestKit 2nd-level object mappingRestKit 2级对象映射
【发布时间】:2023-04-08 15:21:01
【问题描述】:

我将尝试解释我希望如何完成映射:

TOP lvl json 对象包含 Players 对象,它是 Player 对象的数组 每个Player 对象都包含一个数组,我希望数组中的每个对象都属于Event 对象(自定义对象)。

现在,由于我有 Player 对象的映射并且我正在填充数组,而不是 Event 对象(这是我想要的),我得到了 NSDictionary 对象。问题是我确实有我的Event 类的映射。我的问题是让 RestKit 将它们映射到数组中。 我尝试添加 Event 类的 responseDescriptors,但我没有运气。

这里是Player对象映射

 RKObjectMapping* playerMapping = [RKObjectMapping mappingForClass:[Player class]];
    [playerMapping addAttributeMappingsFromDictionary:@{
                                        ...more here              
                                           @"activeEvents" : @"activeEvents"
                                                         }];

这里是请求方法

 NSURL *taskURL = [NSURL URLWithString:kAppWebApiURLPath];

    // Set object manager with base url
    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    objectManager = [RKObjectManager managerWithBaseURL:taskURL];
    objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

    [objectManager.HTTPClient setDefaultHeader:@"Authorization" value:kAppWebAPIKey];
    [objectManager.HTTPClient setDefaultHeader:@"Content-Type" value:@"application/json"];

RKRequestDescriptor * requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[MappingProvider inverseLoginMapping]  objectClass:[LoginInfo class] rootKeyPath:nil method:RKRequestMethodPOST];

[objectManager addRequestDescriptor:requestDescriptor];

RKResponseDescriptor *playersResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[MappingProvider playerMapping] method:RKRequestMethodGET pathPattern:nil keyPath:@"players" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[objectManager addResponseDescriptor:playersResponseDescriptor];

NSLog(@"%@",loginInfo.iOSDeviceToken);
[objectManager postObject:loginInfo path:kAppWebApiLoginPath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
 {}...

更新,我现在需要更进一步的映射,我的播放器对象包含我使用成功映射的事件数组

[playerMapping addRelationshipMappingWithSourceKeyPath:@"activeEvents" mapping:[MappingProvider eventMapping]];

然而现在每个 Event 对象都包含一个 Player 数组,所以它就像 Players -> Events -> Players。

这是 Event 和 Player 对象的映射:

RKObjectMapping* eventMapping = [RKObjectMapping mappingForClass:[Event class]];

    [eventMapping addAttributeMappingsFromDictionary:@{

              @"stuffhere" : @"stuffz"                              
                                                       }];


    RKObjectMapping* playerMapping = [RKObjectMapping mappingForClass:[Player class]];
    [playerMapping addAttributeMappingsFromDictionary:@{
                                                        @"name": @"name",
                                                        @"activeEvents" : @"activeEvents"
                                                        }];
    [eventMapping addRelationshipMappingWithSourceKeyPath:@"activeEvents/players" mapping:playerMapping];

现在我没有得到递归函数,但是我如何在代码中声明以建立这种关系 json 数组的映射以分配给我的本地数组属性?

【问题讨论】:

    标签: ios objective-c mapping restkit restkit-0.20


    【解决方案1】:

    从映射中删除 @"activeEvents" : @"activeEvents" 并将其替换为:

    [playerMapping addRelationshipMappingWithSourceKeyPath:@"activeEvents" mapping:eventMapping];
    

    您还应该只有一个响应描述符,因为数据是嵌套的。

    【讨论】:

    • 它确实给了我一个 Event 对象,但它的所有属性都是空的。有任何想法吗 ?警告:映射嵌套对象失败:(null)
    • 这表明您的eventMapping 是错误的。您需要显示它和 JSON...
    • 是的,我差了一点。修复它并让它运行:),谢谢老兄。聚会派对:P
    • wain,如果你愿意,另一个问题。每个玩家都有一个活跃的事件,但每个活跃的事件中也有玩家,我尝试添加你给我的解决方案来获得一组玩家,但我在事件映射和玩家映射之间调用了一个无限循环。有什么想法吗?
    • 不要使用[MappingProvider ... - 同时创建映射,这样它们就可以直接相互引用而无需递归方法调用
    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多