2014-03-19 19 views
0

我想等记载here但我使用RKEntityMapping,而不是RKObjectMapping我RestKit架构以添加动态映射。 RKEntityMapping继承自RKObjectMapping根据documentation要使用DynamicMapping与EntityMapping上RestKit

我的问题是我无法找到一种方法从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" 
    } 
} 

这是我的代码,我尝试我EntityMapping地图,包含DynamicMapping

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"]; 

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

预先感谢您。

回答

0

你使用它都错了:-)另外,你的关键路径会出现,因为你同时在响应描述符和映射使用@"mapping"是错误的......

看起来你可能不甚至需要动态映射,因为你要么有一个placeestablishment这样的​​的内容并不重要......

对于动态映射(如果你需要它):

这条线:

[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"]; 
+0

感谢您这么快回答!你是对的。我只有一个地方或一个机构,但不是在同一时间。你所说的只关联momentMapping和我的dynamicMapping正是我想要的。我不知道如何配置dynamicMapping以选择哪个映射是好的,因为我尝试了行代码来编写,但它不工作,因为placeMapping不是RKObjectMapping而是RKEntityMapping。 – BriceB

+0

所以你不需要动态映射。 RestKit只会映射您收到的内容并忽略其他关系映射... – Wain

+0

实体映射是一种对象映射。它以什么方式不起作用? – Wain