Skip to content

Commit fe71703

Browse files
committedJan 28, 2015
将框架内部的一些对象方法改用类方法实现
1 parent c51a33d commit fe71703

File tree

9 files changed

+129
-106
lines changed

9 files changed

+129
-106
lines changed
 

‎MJExtensionExample/MJExtensionExample/Classes/StatusResult.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
@implementation StatusResult
1515
// 实现这个方法的目的:告诉MJExtension框架statuses和ads数组里面装的是什么模型
16-
- (NSDictionary *)objectClassInArray
16+
+ (NSDictionary *)objectClassInArray
1717
{
1818
return @{
1919
@"statuses" : [Status class],

‎MJExtensionExample/MJExtensionExample/Classes/Student.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
@implementation Student
1313
// 实现这个方法的目的:告诉MJExtension框架模型中的属性名对应着字典的哪个key
14-
- (NSDictionary *)replacedKeyFromPropertyName
14+
+ (NSDictionary *)replacedKeyFromPropertyName
1515
{
1616
return @{@"ID" : @"id",
1717
@"desc" : @"desciption",

‎MJExtensionExample/MJExtensionExample/MJExtension/MJIvar.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ - (void)setIvar:(Ivar)ivar
4949
MJAssertParamNotNil(ivar);
5050

5151
// 1.成员变量名
52-
_name = [NSString stringWithUTF8String:ivar_getName(ivar)];
52+
_name = @(ivar_getName(ivar));
5353

5454
// 2.属性名
5555
if ([_name hasPrefix:@"_"]) {
@@ -59,7 +59,7 @@ - (void)setIvar:(Ivar)ivar
5959
}
6060

6161
// 3.成员变量的类型符
62-
NSString *code = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
62+
NSString *code = @(ivar_getTypeEncoding(ivar));
6363
_type = [MJType cachedTypeWithCode:code];
6464
}
6565

‎MJExtensionExample/MJExtensionExample/MJExtension/NSObject+MJCoding.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ @implementation NSObject (MJCoding)
1414

1515
- (void)encode:(NSCoder *)encoder
1616
{
17-
[self enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) {
17+
[[self class] enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) {
1818
[encoder encodeObject:[ivar valueFromObject:self] forKey:ivar.name];
1919
}];
2020
}
2121

2222
- (void)decode:(NSCoder *)decoder
2323
{
24-
[self enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) {
24+
[[self class] enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) {
2525
id value = [decoder decodeObjectForKey:ivar.name];
2626
[ivar setValue:value forObject:self];
2727
}];

‎MJExtensionExample/MJExtensionExample/MJExtension/NSObject+MJIvar.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@ typedef void (^MJIvarsBlock)(MJIvar *ivar, BOOL *stop);
2727
/**
2828
* 遍历所有的成员变量
2929
*/
30-
- (void)enumerateIvarsWithBlock:(MJIvarsBlock)block;
3130
+ (void)enumerateIvarsWithBlock:(MJIvarsBlock)block;
3231

3332
/**
3433
* 遍历所有的类
3534
*/
36-
- (void)enumerateClassesWithBlock:(MJClassesBlock)block;
3735
+ (void)enumerateClassesWithBlock:(MJClassesBlock)block;
36+
37+
/**
38+
* 返回一个临时对象
39+
*/
40+
+ (instancetype)tempObject;
3841
@end

‎MJExtensionExample/MJExtensionExample/MJExtension/NSObject+MJIvar.m

+63-25
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,64 @@
1313

1414
@implementation NSObject (MJMember)
1515

16-
static const char MJCachedIvarsKey;
17-
- (NSArray *)cachedIvars
16+
#pragma mark - --私有方法--
17+
+ (NSString *)ivarKey:(NSString *)propertyName
1818
{
19-
NSMutableArray *cachedIvars = objc_getAssociatedObject([self class], &MJCachedIvarsKey);
19+
MJAssertParamNotNil2(propertyName, nil);
20+
21+
NSString *key = nil;
22+
// 1.查看有没有需要替换的key
23+
if ([self respondsToSelector:@selector(replacedKeyFromPropertyName:)]) {
24+
key = [self replacedKeyFromPropertyName:propertyName];
25+
} else if ([self respondsToSelector:@selector(replacedKeyFromPropertyName)]) {
26+
key = self.replacedKeyFromPropertyName[propertyName];
27+
} else {
28+
// 为了兼容以前的对象方法
29+
id tempObject = self.tempObject;
30+
if ([tempObject respondsToSelector:@selector(replacedKeyFromPropertyName)]) {
31+
key = [tempObject replacedKeyFromPropertyName][propertyName];
32+
}
33+
}
34+
35+
// 2.用属性名作为key
36+
if (!key) key = propertyName;
37+
38+
return key;
39+
}
40+
41+
+ (Class)ivarObjectClassInArray:(NSString *)propertyName
42+
{
43+
if ([self respondsToSelector:@selector(objectClassInArray)]) {
44+
return self.objectClassInArray[propertyName];
45+
} else {
46+
// 为了兼容以前的对象方法
47+
id tempObject = self.tempObject;
48+
if ([tempObject respondsToSelector:@selector(objectClassInArray)]) {
49+
id dict = [tempObject objectClassInArray];
50+
return dict[propertyName];
51+
}
52+
return nil;
53+
}
54+
return nil;
55+
}
56+
57+
#pragma mark - --公共方法--
58+
+ (instancetype)tempObject
59+
{
60+
static const char MJTempObjectKey;
61+
id tempObject = objc_getAssociatedObject(self, &MJTempObjectKey);
62+
if (tempObject == nil) {
63+
tempObject = [[self alloc] init];
64+
objc_setAssociatedObject(self, &MJTempObjectKey, tempObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
65+
}
66+
return tempObject;
67+
}
68+
69+
+ (void)enumerateIvarsWithBlock:(MJIvarsBlock)block
70+
{
71+
static const char MJCachedIvarsKey;
72+
// 获得成员变量
73+
NSMutableArray *cachedIvars = objc_getAssociatedObject(self, &MJCachedIvarsKey);
2074
if (cachedIvars == nil) {
2175
cachedIvars = [NSMutableArray array];
2276

@@ -28,45 +82,29 @@ - (NSArray *)cachedIvars
2882
// 2.遍历每一个成员变量
2983
for (unsigned int i = 0; i<outCount; i++) {
3084
MJIvar *ivar = [MJIvar cachedIvarWithIvar:ivars[i]];
31-
ivar.key = [self keyWithPropertyName:ivar.propertyName];
85+
ivar.key = [self ivarKey:ivar.propertyName];
3286
// 如果有多级映射
3387
ivar.keys = [ivar.key componentsSeparatedByString:@"."];
3488
// 数组中的模型类
35-
if ([self respondsToSelector:@selector(objectClassInArray)]) {
36-
ivar.objectClassInArray = self.objectClassInArray[ivar.propertyName];
37-
}
89+
ivar.objectClassInArray = [self ivarObjectClassInArray:ivar.propertyName];
3890
ivar.srcClass = c;
3991
[cachedIvars addObject:ivar];
4092
}
4193

4294
// 3.释放内存
4395
free(ivars);
4496
}];
45-
objc_setAssociatedObject([self class], &MJCachedIvarsKey, cachedIvars, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
97+
objc_setAssociatedObject(self, &MJCachedIvarsKey, cachedIvars, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
4698
}
47-
return cachedIvars;
48-
}
49-
50-
- (void)enumerateIvarsWithBlock:(MJIvarsBlock)block
51-
{
52-
NSArray *ivars = [self cachedIvars];
99+
100+
// 遍历成员变量
53101
BOOL stop = NO;
54-
for (MJIvar *ivar in ivars) {
102+
for (MJIvar *ivar in cachedIvars) {
55103
block(ivar, &stop);
56104
if (stop) break;
57105
}
58106
}
59107

60-
+ (void)enumerateIvarsWithBlock:(MJIvarsBlock)block
61-
{
62-
63-
}
64-
65-
- (void)enumerateClassesWithBlock:(MJClassesBlock)block
66-
{
67-
[[self class] enumerateClassesWithBlock:block];
68-
}
69-
70108
+ (void)enumerateClassesWithBlock:(MJClassesBlock)block
71109
{
72110
// 1.没有block就直接返回

‎MJExtensionExample/MJExtensionExample/MJExtension/NSObject+MJKeyValue.h

+13-12
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,25 @@
1919
*
2020
* @return 字典中的key是属性名,value是从字典中取值用的key
2121
*/
22-
- (NSDictionary *)replacedKeyFromPropertyName;
22+
+ (NSDictionary *)replacedKeyFromPropertyName;
23+
- (NSDictionary *)replacedKeyFromPropertyName MJDeprecated("请使用+ (NSDictionary *)replacedKeyFromPropertyName方法");
24+
25+
/**
26+
* 将属性名换为其他key去字典中取值
27+
* @param propertyName 属性名
28+
*
29+
* @return 字典中的key
30+
*/
31+
+ (NSString *)replacedKeyFromPropertyName:(NSString *)propertyName;
32+
// 方法优先级:replacedKeyFromPropertyName: > replacedKeyFromPropertyName
2333

2434
/**
2535
* 数组中需要转换的模型类
2636
*
2737
* @return 字典中的key是数组属性名,value是数组中存放模型的Class
2838
*/
29-
- (NSDictionary *)objectClassInArray;
39+
+ (NSDictionary *)objectClassInArray;
40+
- (NSDictionary *)objectClassInArray MJDeprecated("请使用+ (NSDictionary *)objectClassInArray方法");
3041

3142
/**
3243
* 当字典转模型完毕时调用
@@ -116,14 +127,4 @@
116127
* @return 模型数组
117128
*/
118129
+ (NSArray *)objectArrayWithFile:(NSString *)file;
119-
120-
#pragma mark - 其他方法
121-
/**
122-
* 根据属性名获得对应的key
123-
*
124-
* @param propertyName 属性名
125-
*
126-
* @return 字典的key
127-
*/
128-
- (NSString *)keyWithPropertyName:(NSString *)propertyName;
129130
@end

‎MJExtensionExample/MJExtensionExample/MJExtension/NSObject+MJKeyValue.m

+42-61
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ + (void)load
2323
}
2424

2525
#pragma mark - --公共方法--
26-
#pragma mark - 字典转模型
2726
+ (instancetype)objectWithJSONData:(NSData *)data
2827
{
2928
MJAssertParamNotNil2(data, nil);
@@ -57,7 +56,7 @@ - (instancetype)setKeyValues:(NSDictionary *)keyValues
5756
{
5857
MJAssert2([keyValues isKindOfClass:[NSDictionary class]], self);
5958

60-
[self enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) {
59+
[[self class] enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) {
6160
// 1.取出属性值
6261
id value = keyValues ;
6362
for (NSString *key in ivar.keys) {
@@ -103,14 +102,52 @@ - (instancetype)setKeyValues:(NSDictionary *)keyValues
103102
return self;
104103
}
105104

105+
+ (NSArray *)objectArrayWithJSONData:(NSData *)data
106+
{
107+
MJAssertParamNotNil2(data, nil);
108+
109+
return [self objectArrayWithKeyValuesArray:[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]];
110+
}
111+
112+
+ (NSArray *)objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray
113+
{
114+
// 1.判断真实性
115+
MJAssert2([keyValuesArray isKindOfClass:[NSArray class]], nil);
116+
117+
// 2.创建数组
118+
NSMutableArray *modelArray = [NSMutableArray array];
119+
120+
// 3.遍历
121+
for (NSDictionary *keyValues in keyValuesArray) {
122+
id model = [self objectWithKeyValues:keyValues];
123+
if (model) [modelArray addObject:model];
124+
}
125+
126+
return modelArray;
127+
}
128+
129+
+ (NSArray *)objectArrayWithFilename:(NSString *)filename
130+
{
131+
MJAssertParamNotNil2(filename, nil);
132+
133+
return [self objectArrayWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
134+
}
135+
136+
+ (NSArray *)objectArrayWithFile:(NSString *)file
137+
{
138+
MJAssertParamNotNil2(file, nil);
139+
140+
return [self objectArrayWithKeyValuesArray:[NSArray arrayWithContentsOfFile:file]];
141+
}
142+
106143
- (NSDictionary *)keyValues
107144
{
108145
// 如果自己不是模型类
109146
if ([MJFoundation isClassFromFoundation:[self class]]) return (NSDictionary *)self;
110147

111-
__block NSMutableDictionary *keyValues = [NSMutableDictionary dictionary];
148+
__block NSMutableDictionary *keyValues = [NSMutableDictionary dictionary];
112149

113-
[self enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) {
150+
[[self class] enumerateIvarsWithBlock:^(MJIvar *ivar, BOOL *stop) {
114151
// 1.取出属性值
115152
id value = [ivar valueFromObject:self];
116153
if (!value) return;
@@ -142,7 +179,7 @@ - (NSDictionary *)keyValues
142179
}
143180
innerDict = tempDict;
144181
}
145-
}];
182+
}];
146183
}];
147184

148185
// 转换完毕
@@ -153,13 +190,6 @@ - (NSDictionary *)keyValues
153190
return keyValues;
154191
}
155192

156-
+ (NSArray *)objectArrayWithJSONData:(NSData *)data
157-
{
158-
MJAssertParamNotNil2(data, nil);
159-
160-
return [self objectArrayWithKeyValuesArray:[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]];
161-
}
162-
163193
+ (NSArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray
164194
{
165195
// 0.判断真实性
@@ -172,53 +202,4 @@ + (NSArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray
172202
}
173203
return keyValuesArray;
174204
}
175-
176-
#pragma mark - 字典数组转模型数组
177-
+ (NSArray *)objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray
178-
{
179-
// 1.判断真实性
180-
MJAssert2([keyValuesArray isKindOfClass:[NSArray class]], nil);
181-
182-
// 2.创建数组
183-
NSMutableArray *modelArray = [NSMutableArray array];
184-
185-
// 3.遍历
186-
for (NSDictionary *keyValues in keyValuesArray) {
187-
id model = [self objectWithKeyValues:keyValues];
188-
if (model) [modelArray addObject:model];
189-
}
190-
191-
return modelArray;
192-
}
193-
194-
+ (NSArray *)objectArrayWithFilename:(NSString *)filename
195-
{
196-
MJAssertParamNotNil2(filename, nil);
197-
198-
return [self objectArrayWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
199-
}
200-
201-
+ (NSArray *)objectArrayWithFile:(NSString *)file
202-
{
203-
MJAssertParamNotNil2(file, nil);
204-
205-
return [self objectArrayWithKeyValuesArray:[NSArray arrayWithContentsOfFile:file]];
206-
}
207-
208-
#pragma mark - --私有方法--
209-
- (NSString *)keyWithPropertyName:(NSString *)propertyName
210-
{
211-
MJAssertParamNotNil2(propertyName, nil);
212-
213-
NSString *key = nil;
214-
// 1.查看有没有需要替换的key
215-
if ([self respondsToSelector:@selector(replacedKeyFromPropertyName)]) {
216-
key = self.replacedKeyFromPropertyName[propertyName];
217-
}
218-
219-
// 2.用属性名作为key
220-
if (!key) key = propertyName;
221-
222-
return key;
223-
}
224205
@end

0 commit comments

Comments
 (0)
Please sign in to comment.