mirror of
https://github.com/zhigang1992/RestKit.git
synced 2026-04-01 17:39:46 +08:00
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:
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user