在 RestKit 上使用 DynamicMapping 和 EntityMapping
Posted
技术标签:
【中文标题】在 RestKit 上使用 DynamicMapping 和 EntityMapping【英文标题】:To use a DynamicMapping with EntityMapping on RestKit 【发布时间】:2014-03-19 16:27:29 【问题描述】:我想在我的 RestKit 架构上添加一个动态映射,如 here 所述,但我使用的是 RKEntityMapping 而不是 RKObjectMapping。 RKEntityMapping 根据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
映射我的 EntityMappingRKEntityMapping *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"
...
看起来您甚至可能不需要动态映射,因为您要么拥有place
或establishment
,所以spot_type
的内容无关紧要...
对于动态映射(如果你确实需要的话):
这一行:
[momentMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"moment.place" toKeyPath:@"place" withMapping:placeMapping]];
还有这个:
[momentMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"moment.establishment" toKeyPath:@"establishment" withMapping:establishmentMapping]];
直接链接momentMapping
和placeMapping
和establishmentMapping
而你不想这样做。相反,您应该做的只是将momentMapping
与您的dynamicMapping
链接,然后dynamicMapping
选择是否真的应该使用placeMapping
或establishmentMapping
。
动态映射将配置为:
[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的主要内容,如果未能解决你的问题,请参考以下文章
在 Mac 10.12 上使用哪个 cocoapods 版本,如果 Restkit 是依赖项
通过 CocoaPods 在 github 上使用 Restkit 的一个分支?
在类型的对象上找不到 Restkit 2.0 'managedObjectContext'