Skip to content

Commit 25ac2c0

Browse files
author
Aryan Ghassemi
committed
Huge performance improvement, specially in cases where not all key values are mapped from dictionary to properties
1 parent bf17756 commit 25ac2c0

File tree

1 file changed

+58
-27
lines changed

1 file changed

+58
-27
lines changed

OCMapper/Source/ObjectMapper.m

Lines changed: 58 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939

4040
@interface ObjectMapper()
4141
@property (nonatomic, strong) NSMutableArray *commonDateFormaters;
42+
@property (nonatomic, strong) NSMutableArray *classNamesInMainBundle;
43+
@property (nonatomic, strong) NSMutableDictionary *mappedClassNames;
4244
@end
4345

4446
@implementation ObjectMapper
@@ -62,6 +64,16 @@ + (ObjectMapper *)sharedInstance
6264
return singleton;
6365
}
6466

67+
- (id)init
68+
{
69+
if (self = [super init])
70+
{
71+
[self populateClassNamesInMainBundle];
72+
}
73+
74+
return self;
75+
}
76+
6577
#pragma mark - Public Methods -
6678

6779
- (id)objectFromSource:(id)source toInstanceOfClass:(Class)class
@@ -103,6 +115,36 @@ - (id)dictionaryFromObject:(NSObject *)object
103115

104116
#pragma mark - Private Methods -
105117

118+
- (void)populateClassNamesInMainBundle
119+
{
120+
self.classNamesInMainBundle = [NSMutableArray array];
121+
122+
int numClasses;
123+
Class *classes = NULL;
124+
125+
classes = NULL;
126+
numClasses = objc_getClassList(NULL, 0);
127+
128+
if (numClasses > 0)
129+
{
130+
classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);
131+
numClasses = objc_getClassList(classes, numClasses);
132+
133+
for (int i = 0; i < numClasses; i++)
134+
{
135+
@autoreleasepool
136+
{
137+
Class class = classes[i];
138+
139+
if ([NSBundle bundleForClass:class] == [NSBundle mainBundle])
140+
[self.classNamesInMainBundle addObject:NSStringFromClass(class)];
141+
}
142+
}
143+
}
144+
145+
free(classes);
146+
}
147+
106148
- (NSArray *)processDictionaryFromArray:(NSArray *)array
107149
{
108150
NSMutableArray *result = [NSMutableArray array];
@@ -215,13 +257,13 @@ - (id)processDictionary:(NSDictionary *)source forClass:(Class)class
215257
{
216258
propertyName = [self.instanceProvider propertyNameForObject:object byCaseInsensitivePropertyName:key];
217259

218-
if ([value isKindOfClass:[NSDictionary class]] || [value isKindOfClass:[NSArray class]])
260+
if (propertyName && ([value isKindOfClass:[NSDictionary class]] || [value isKindOfClass:[NSArray class]]))
219261
{
220262
objectType = [self classFromString:key];
221263
}
222264
}
223265

224-
if (class && object && [object respondsToSelector:NSSelectorFromString(propertyName)])
266+
if (class && object && propertyName && [object respondsToSelector:NSSelectorFromString(propertyName)])
225267
{
226268
ILog(@"Mapping key(%@) to property(%@) from data(%@)", key, propertyName, [value class]);
227269

@@ -287,7 +329,10 @@ - (id)processArray:(NSArray *)value forClass:(Class)class
287329

288330
- (Class)classFromString:(NSString *)className
289331
{
290-
Class result = nil;
332+
Class result = [self.mappedClassNames objectForKey:className];
333+
334+
if (result)
335+
return result;
291336

292337
if (NSClassFromString(className))
293338
return NSClassFromString(className);
@@ -297,35 +342,21 @@ - (Class)classFromString:(NSString *)className
297342

298343
NSString *classNameLowerCase = [className lowercaseString];
299344

300-
int numClasses;
301-
Class *classes = NULL;
302-
303-
classes = NULL;
304-
numClasses = objc_getClassList(NULL, 0);
305-
306-
if (numClasses > 0)
345+
for (NSString *className in self.classNamesInMainBundle)
307346
{
308-
classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);
309-
numClasses = objc_getClassList(classes, numClasses);
310-
311-
for (int i = 0; i < numClasses; i++)
347+
@autoreleasepool
312348
{
313-
@autoreleasepool
349+
NSString *thisClassNameLowerCase = [className lowercaseString];
350+
351+
if ([thisClassNameLowerCase isEqual:classNameLowerCase] ||
352+
[[NSString stringWithFormat:@"%@s", thisClassNameLowerCase] isEqual:classNameLowerCase] ||
353+
[[NSString stringWithFormat:@"%@es", thisClassNameLowerCase] isEqual:classNameLowerCase])
314354
{
315-
Class class = classes[i];
316-
NSString *thisClassNameLowerCase = [NSStringFromClass(class) lowercaseString];
317-
318-
if ([thisClassNameLowerCase isEqual:classNameLowerCase] ||
319-
[[NSString stringWithFormat:@"%@s", thisClassNameLowerCase] isEqual:classNameLowerCase] ||
320-
[[NSString stringWithFormat:@"%@es", thisClassNameLowerCase] isEqual:classNameLowerCase])
321-
{
322-
result = class;
323-
break;
324-
}
355+
result = NSClassFromString(className);
356+
[self.mappedClassNames setObject:result forKey:className];
357+
break;
325358
}
326359
}
327-
328-
free(classes);
329360
}
330361

331362
return result;

0 commit comments

Comments
 (0)