Fixes a crash in RKObjectMappingProvider where objectMappingsForClass is called after some dynamic mappings have been registered in the provider. Fixes #342. Thanks to @bjornjonsson

This commit is contained in:
Greg Combs
2011-09-14 20:32:37 -05:00
parent 3006516794
commit a1b2201f2a
2 changed files with 32 additions and 4 deletions

View File

@@ -66,12 +66,14 @@
- (NSArray*)objectMappingsForClass:(Class)theClass {
NSMutableArray* mappings = [NSMutableArray array];
NSArray* mappingsToSearch = [[NSArray arrayWithArray:_objectMappings] arrayByAddingObjectsFromArray:[_mappingsByKeyPath allValues]];
for (RKObjectMapping* objectMapping in mappingsToSearch) {
if (objectMapping.objectClass == theClass && ![mappings containsObject:objectMapping]) {
[mappings addObject:objectMapping];
for (NSObject <RKObjectMappingDefinition> *candidateMapping in mappingsToSearch) {
if (![candidateMapping respondsToSelector:@selector(objectClass)] || [mappings containsObject:candidateMapping])
continue;
Class mappedClass = [candidateMapping performSelector:@selector(objectClass)];
if (mappedClass == theClass) {
[mappings addObject:candidateMapping];
}
}
return [NSArray arrayWithArray:mappings];
}

View File

@@ -1509,6 +1509,32 @@
assertThat([mappingProvider objectMappingsForClass:[RKExampleUser class]], is(equalTo([NSArray arrayWithObjects:firstMapping, secondMapping, thirdMapping, nil])));
}
- (void)itShouldReturnAllMappingsForAClassAndNotExplodeWithRegisteredDynamicMappings {
RKObjectMappingProvider* provider = [[RKObjectMappingProvider new] autorelease];
RKObjectMapping* boyMapping = [RKObjectMapping mappingForClass:[Boy class]];
[boyMapping mapAttributes:@"name", nil];
RKObjectMapping* girlMapping = [RKObjectMapping mappingForClass:[Girl class]];
[girlMapping mapAttributes:@"name", nil];
RKObjectDynamicMapping* dynamicMapping = [RKObjectDynamicMapping dynamicMapping];
[dynamicMapping setObjectMapping:boyMapping whenValueOfKeyPath:@"type" isEqualTo:@"Boy"];
[dynamicMapping setObjectMapping:girlMapping whenValueOfKeyPath:@"type" isEqualTo:@"Girl"];
[provider setMapping:dynamicMapping forKeyPath:@"dynamic"];
RKObjectMapping* firstMapping = [RKObjectMapping mappingForClass:[RKExampleUser class]];
RKObjectMapping* secondMapping = [RKObjectMapping mappingForClass:[RKExampleUser class]];
[provider addObjectMapping:firstMapping];
[provider setMapping:secondMapping forKeyPath:@"second"];
NSException* exception = nil;
NSArray *actualMappings = nil;
@try {
actualMappings = [provider objectMappingsForClass:[RKExampleUser class]];
}
@catch (NSException * e) {
exception = e;
}
[expectThat(exception) should:be(nil)];
assertThat(actualMappings, is(equalTo([NSArray arrayWithObjects:firstMapping, secondMapping, nil])));
}
#pragma mark - RKObjectDynamicMapping
- (void)itShouldMapASingleObjectDynamically {