RKRelationshipMapping с родительским объектом Restkit
У меня есть отображение основных данных, показанное здесь:
Это JSON:
{
user: {
rid: '1234'
providers: {
[
foursquare: {
rid: '1234'
},
facebook: {
rid: '1234'
}
]
}
}
Использует это отображение:
RKEntityMapping *foursquareProviderMapping = [RKEntityMapping mappingForEntityForName:@"FoursquareProvider" inManagedObjectStore:managedObjectStore];
foursquareProviderMapping.identificationAttributes = @[@"rid"];
[foursquareProviderMapping addAttributeMappingsFromArray:@[@"rid"]];
RKEntityMapping *facebookProviderMapping = [RKEntityMapping mappingForEntityForName:@"FacebookProvider" inManagedObjectStore:managedObjectStore];
facebookProviderMapping.identificationAttributes = @[@"rid"];
[facebookProviderMapping addAttributeMappingsFromArray:@[@"rid"]];
RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:managedObjectStore];
userMapping.identificationAttributes = @[@"rid"];
[userMapping addAttributeMappingsFromArray:@[@"rid"]];
[userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"providers.foursquare" toKeyPath:@"providers" withMapping:foursquareProviderMapping]];
[userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"providers.facebook" toKeyPath:@"providers" withMapping:facebookProviderMapping]];
Это приводит к ошибке сопоставления пути с несколькими ключами для toKeyPath:@"provider"
Есть ли правильный способ отобразить это? У меня есть полный контроль над JSON, если его нужно изменить.
1 ответ
Вы можете использовать RKDynamicMapping для решения этой проблемы. Сначала вы должны изменить свой JSON.
{
user: {
rid: '1234'
providers: [
{
type: "foursquare"
rid: '1234'
},
{
type: "facebook"
rid: '1234'
}
]
}
}
После этого используйте динамическое отображение, как это
RKEntityMapping *foursquareProviderMapping = [RKEntityMapping mappingForEntityForName:@"FoursquareProvider" inManagedObjectStore:managedObjectStore];
foursquareProviderMapping.identificationAttributes = @[@"rid"];
[foursquareProviderMapping addAttributeMappingsFromArray:@[@"rid"]];
RKEntityMapping *facebookProviderMapping = [RKEntityMapping mappingForEntityForName:@"FacebookProvider" inManagedObjectStore:managedObjectStore];
facebookProviderMapping.identificationAttributes = @[@"rid"];
[facebookProviderMapping addAttributeMappingsFromArray:@[@"rid"]];
RKDynamicMapping *dynamicMapping = [RKDynamicMapping new];
[dynamicMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"type" expectedValue:@"facebook" objectMapping:facebookProviderMapping]];
[dynamicMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"type" expectedValue:@"foursquare" objectMapping:foursquareProviderMapping]];
RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:managedObjectStore];
userMapping.identificationAttributes = @[@"rid"];
[userMapping addAttributeMappingsFromArray:@[@"rid"]];
[userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"providers" toKeyPath:@"providers" withMapping:dynamicMapping]];