·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> iOS开发--BaseModel

iOS开发--BaseModel

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

  软件开发过程中,需要解析各种各样的数据.如最基础的plist文件,从网络下载获取的json数据,以及xml网页数据,还有比较重要的Core Data数据.

  下面我来分享一种快速将json文件中的字典转为模型的方法.虽然很多人在用第三方类库解析json数据,不过将json文件中的字典转为模型内部的实现原理还是需要了解一下的.

  下面是BaseModel.h声明文件,向外界开方了两个方法:

  第7行的方法是实现json文件中的字典转模型;

  第10行方法是防止出现特殊类型的数据无法转为模型而导致程序异常.

 1 BaseModel.h
 2 
 3 #import <Foundation/Foundation.h>
 4 
 5 @interface BaseModel : NSObject
 6 
 7 - (instancetype)initWithDictionary:(NSDictionary *)jsonDictionary;
 8 
 9 // 将json中的value值交给model的属性(覆写该方法可以将json文件中特殊的数据加到model中)特殊类型如:NSNull类型数据
10 - (void)setAttributesWithDictionary:(NSDictionary *)jsonDict;
11 
12 @end

  

  下面是BaseModel.m实现文件

 

 1 BaseModel.m
 2 
 3 #import "BaseModel.h"
 4 
 5 @implementation BaseModel
 6 
 7 - (instancetype)initWithDictionary:(NSDictionary *)jsonDictionary
 8 {
 9     self = [super init];
10     
11     if (self) {
12         // 将jsonDictionary字典的value值交给model的属性值
13         [self setAttributesWithDictionary:jsonDictionary];
14     }
15     return self;
16 }
17 
18 // 将jsonDictionary字典的value值交给model的属性值
19 - (void)setAttributesWithDictionary:(NSDictionary *)jsonDictionary
20 {
21     // 获取映射关系
22     NSDictionary *modelDictionary = [self attributesModel:jsonDictionary];
23     
24     for (NSString *jsonKey in modelDictionary) {
25         // 取得属性名
26         NSString *modelAttributesNmae = [modelDictionary objectForKey:jsonKey];
27         
28         // 取得Value值
29         id jsonValue = [jsonDictionary objectForKey:jsonKey];
30         
31         // 获取属性的setter方法
32         SEL setterSEL = [self stringToSEL:modelAttributesNmae];
33         
34         // 如果Value值为NULL,则赋值为""(什么也没有)
35         if ([jsonValue isKindOfClass:[NSNull class]]) {
36             jsonValue = @"";
37         }
38         
39         // Warning:PerformSelector may cause a leak because its selector is unknown(PerformSelector可能导致内存泄漏,因为它选择器是未知的)
40         if ([self respondsToSelector:setterSEL]) {
41             [self performSelector:setterSEL withObject:jsonValue];
42         }
43         
44     }
45 }
46 
47 // 将字典中的key和model的属性名映射
48 - (NSDictionary *)attributesModel:(NSDictionary *)jsonDictionary
49 {
50     NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
51     
52     // 属性名和jsonDictionary的key一样
53     for (NSString *jsonKey in jsonDictionary) {
54         [dict setValue:jsonKey forKey:jsonKey];
55     }
56     return dict;
57 }
58 
59 // 获取属性的setter方法
60 - (SEL)stringToSEL:(NSString *)modelAttributes
61 {
62     // 截取属性名的首字母
63     NSString *firstString = [modelAttributes substringToIndex:1];
64     
65     // 首字母大写
66     firstString = [firstString uppercaseString];
67     
68     // 截取除首字母以外的其它属性名内容
69     NSString *endString = [modelAttributes substringFromIndex:1];
70     
71     // 拼接setter方法名
72     NSString *selString = [NSString stringWithFormat:@"set%@%@:",firstString, endString];
73     
74     // 将字符串转化为方法
75     SEL selector = NSSelectorFromString(selString);
76     
77     return selector;
78 }
79 
80 @end

 

  其中BaseModel.m实现文件的第41行会报一个警告,警告的内容上面已经给出了.

  到此为止,一个将json文件中的字典转为模型的类已经实现了.

  BaseModel的使用大家可以自己测试一下,在这里就不在演示了.