12
12
#import " ParseModel.h"
13
13
#import " ParseModelUser.h"
14
14
15
+ @interface ParseModelUtils ()
16
+ @property (nonatomic , strong ) NSMutableDictionary *registeredParseModels;
17
+ @end
18
+
15
19
@implementation ParseModelUtils
16
20
17
21
+ (instancetype )sharedUtilities
@@ -28,6 +32,24 @@ + (instancetype)sharedUtilities
28
32
return parseModelUtils;
29
33
}
30
34
35
+ - (BOOL )registerParseModel : (Class )parseModelClass
36
+ {
37
+ // Get out of there cat! You are not a ParseModel.
38
+ // http://getoutoftherecat.tumblr.com/
39
+ if ([parseModelClass isSubclassOfClass: [ParseModel class ]] == NO ) {
40
+ return NO ;
41
+ }
42
+
43
+ if (!self.registeredParseModels ) {
44
+ self.registeredParseModels = [[NSMutableDictionary alloc ] init ];
45
+ }
46
+
47
+ [self .registeredParseModels setObject: NSStringFromClass (parseModelClass)
48
+ forKey: [parseModelClass parseModelClass ]];
49
+
50
+ return YES ;
51
+ }
52
+
31
53
- (id )performBoxingIfNecessary : (id )object
32
54
{
33
55
id boxedObject = object;
@@ -87,26 +109,47 @@ - (id)performUnboxingIfNecessary:(id)object targetClass:(Class)targetClass
87
109
88
110
// Let's get recursive
89
111
// Handle arrays and dictionaries...
90
- else if ([targetClass isKindOfClass: [NSArray class ]]) {
112
+ else if ([object isKindOfClass: [NSArray class ]]) {
91
113
NSMutableArray *unboxedArray = [NSMutableArray array ];
92
114
for (id interalObject in object) {
93
- [unboxedArray addObject: [[ParseModelUtils sharedUtilities ] performUnboxingIfNecessary: object targetClass: targetClass]];
115
+ [unboxedArray addObject: [[ParseModelUtils sharedUtilities ] performUnboxingIfNecessary: interalObject
116
+ targetClass: [self resolveModelClassForObject: interalObject]]];
94
117
}
95
118
unboxedObject = unboxedArray;
96
119
}
97
- else if ([targetClass isKindOfClass: [NSDictionary class ]]) {
120
+ else if ([object isKindOfClass: [NSDictionary class ]]) {
98
121
NSMutableDictionary *unboxedDictionary = [NSMutableDictionary dictionary ];
99
122
NSArray *keys = [object allKeys ];
100
123
for (id key in keys) {
101
- id unboxedKey = [[ParseModelUtils sharedUtilities ] performUnboxingIfNecessary: key targetClass: [key class ]];
102
- id unboxedValue = [[ParseModelUtils sharedUtilities ] performUnboxingIfNecessary: [object objectForKey: key]
103
- targetClass: [[object objectForKey: key] class ]];
124
+ id unboxedKey = [[ParseModelUtils sharedUtilities ] performUnboxingIfNecessary: key targetClass: [self resolveModelClassForObject: key]];
125
+ id rawValue = [object objectForKey: key];
126
+ id unboxedValue = [[ParseModelUtils sharedUtilities ] performUnboxingIfNecessary: rawValue
127
+ targetClass: [self resolveModelClassForObject: rawValue]];
104
128
[unboxedDictionary setObject: unboxedValue forKey: unboxedKey];
105
129
}
106
130
unboxedObject = unboxedDictionary;
107
131
}
108
132
133
+ // Lastly, if this class is a PFObject and it is registered, instantiate the appropriate ParseModel...
134
+ else if ([object isKindOfClass: [PFObject class ]]) {
135
+ NSString *unboxedClassString = [self .registeredParseModels objectForKey: [(PFObject *)object parseClassName ]];
136
+ if (unboxedClassString.length ) {
137
+ unboxedObject = [[NSClassFromString (unboxedClassString) alloc ] initWithParseObject: object];
138
+ }
139
+ }
140
+
109
141
return unboxedObject;
110
142
}
111
143
144
+ - (Class )resolveModelClassForObject : (id )object
145
+ {
146
+ if ([object isKindOfClass: [PFObject class ]]) {
147
+ NSString *classString = [self .registeredParseModels objectForKey: [(PFObject *)object parseClassName ]];
148
+ return NSClassFromString (classString);
149
+ }
150
+ else {
151
+ return [object class ];
152
+ }
153
+ }
154
+
112
155
@end
0 commit comments