在 RestKit 上使用 DynamicMapping 和 EntityMapping

Posted

技术标签:

【中文标题】在 RestKit 上使用 DynamicMapping 和 EntityMapping【英文标题】:To use a DynamicMapping with EntityMapping on RestKit 【发布时间】:2014-03-19 16:27:29 【问题描述】:

我想在我的 RestKit 架构上添加一个动态映射,如 here 所述,但我使用的是 RKEntityMapping 而不是 RKObjectMappingRKEntityMapping 根据documentation 继承自RKObjectMapping

我的问题是我无法找到从 EntityMapping 中提取 ObjectMapping 的方法。我什至不知道这是否可能。

这是我要解析的 JSON:

"moment": 
    "id": 23,
    "is_closed": false,
    "created_at": "2013-04-19 19:28:42.533901",
    "updated_at": "2013-04-19 19:28:42.533901",
    "spot_id": "1",
    "spot_type": "Place",
    "place": 
        "id": 21,
        "name": "First place"
    

这是我的代码,我尝试用 DynamicMapping

映射我的 EntityMapping
RKEntityMapping *momentMapping = [RKEntityMapping mappingForEntityForName:@"Moment" inManagedObjectStore:store];
momentMapping.identificationAttributes = @[ @"momentId"];
[momentMapping addAttributeMappingsFromDictionary:@
                                                          @"moment.id" : @"momentId",
                                                          @"moment.name" : @"name",
                                                          @"moment.creator.id" : @"creatorId",
                                                          @"moment.spot_id" : @"spotId",
                                                          @"moment.spot_type" : @"spotType",
                                                          @"moment.is_closed" : @"isClosed",
                                                          @"moment.created_at" : @"createdAt",
                                                          @"moment.updated_at" : @"updatedAt"
                                                          ];

//Add mapping of the place
RKEntityMapping *placeMapping = [APICallPlace RKGetPlaceMappingForManagedObjectStore:store];
[placeMapping addConnectionForRelationship:@"moments" connectedBy:@ @"placeId": @"spotId" ];
//[momentMapping addConnectionForRelationship:@"place" connectedBy:@@"placeId": @"placeId"];
[momentMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"moment.place"
                                                                              toKeyPath:@"place"
                                                                            withMapping:placeMapping]];
//Add mapping of the establishment
RKEntityMapping *establishmentMapping = [APICallEstablishment RKGetEstablishmentMappingForManagedObjectStore:store];
[establishmentMapping addConnectionForRelationship:@"moments" connectedBy:@ @"establishmentId": @"spotId" ];
//[momentMapping addConnectionForRelationship:@"place" connectedBy:@@"placeId": @"placeId"];
[momentMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"moment.establishment"
                                                                              toKeyPath:@"establishment"
                                                                            withMapping:establishmentMapping]];

我想附上一个动态映射。我在下面尝试过这种方式。我添加了 ??? 以显示我的问题在哪里。 setObjectMapping 方法需要一个 RKObjectMapping 但我只有一个 EntityMapping。

RKDynamicMapping* dynamicMapping = [RKDynamicMapping new];
[placeMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"spot" toKeyPath:@"spot" withMapping:dynamicMapping]];

// Connect a response descriptor for our dynamic mapping
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:dynamicMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"moment" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];

[dynamicMapping setObjectMapping:(RKObjectMapping *)placeMapping.requestMapping whenValueOfKeyPath:@"spot_type" isEqualTo:@"Place"];


[dynamicMapping setObjectMapping:(RKObjectMapping *)establishmentMapping.requestMapping whenValueOfKeyPath:@"spot_type" isEqualTo:@"Establishment"];

如果有人有解决这个问题的想法,我会非常感激听到它!

提前谢谢你。

【问题讨论】:

【参考方案1】:

您完全错误地使用它:-) 另外,您的关键路径似乎是错误的,因为您在响应描述符和映射中都使用了@"mapping"...

看起来您甚至可能不需要动态映射,因为您要么拥有placeestablishment,所以spot_type 的内容无关紧要...

对于动态映射(如果你确实需要的话):

这一行:

[momentMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"moment.place" toKeyPath:@"place" withMapping:placeMapping]];

还有这个:

[momentMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"moment.establishment" toKeyPath:@"establishment" withMapping:establishmentMapping]];

直接链接momentMappingplaceMappingestablishmentMapping 而你不想这样做。相反,您应该做的只是将momentMapping 与您的dynamicMapping 链接,然后dynamicMapping 选择是否真的应该使用placeMappingestablishmentMapping

动态映射将配置为:

[dynamicMapping setObjectMapping:placeMapping whenValueOfKeyPath:@"spot_type" isEqualTo:@"Place"];

【讨论】:

感谢您这么快的答复!你是对的。我只有一个地方或机构,但不能同时拥有。您所说的仅将 momentMapping 与我的 dynamicMapping 联系起来正是我想要的。我不知道如何配置动态映射以选择哪个映射是好的映射,因为我尝试编写行代码但它不起作用,因为 placeMapping 不是 RKObjectMapping 而是 RKEntityMapping。 所以你不需要动态映射。 RestKit 只会映射您收到的内容并忽略其他关系映射... 实体映射是一种对象映射。它在什么方面不起作用? 你说得对,这就是我不明白的原因。 XCode 说:“RKDynamicMapping”没有可见的@interface 声明选择器“setObjectMapping:whenValueOfKeyPath:isEqualTo:”我认为它没有直接链接到 RestKit,因为我之前已经看到过这个错误。 (我是一名新的 ios 开发人员)。 我猜你在网上看到过这个方法,它一定是旧版本的,现在不可用......

以上是关于在 RestKit 上使用 DynamicMapping 和 EntityMapping的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 restkit 忽略已发布对象上的空属性

在 Mac 10.12 上使用哪个 cocoapods 版本,如果 Restkit 是依赖项

通过 CocoaPods 在 github 上使用 Restkit 的一个分支?

在类型的对象上找不到 Restkit 2.0 'managedObjectContext'

RestKit - 无法在我的 tableView 上显示 JSON 数据

在 GET 上创建的 RestKit 托管对象总是为 bool 返回 false