数据模型解析工具Mantle分析

数据模型解析工具源码分析

Mantle

Mantle 是由 Github 开发的一款模型框架,是一个用于简化应用程序中model层的第三方库。通常我们的应该中都会定义大量的model来表示各种数据结构,而这些model的初始化和编码解码都需要写大量的代码。而Mantle的优点在于能够大大地简化这些代码。本文主要介绍 Mantle 中最常使用的功能:字典转模型

Mantle源码中最主要的内容包括:

  • MTLJSONSerializing协议:需要与JSON字典进行相互转换的MTLModel的子类都需要实现该协议,以方便MTLJSONApadter对象进行转换。
  • MTLModel类:通常是作为我们的Model的基类,该类提供了一些默认的行为来处理对象的初始化和归档操作,同时可以获取到对象所有属性的键值集合。
  • MTLJSONAdapter类:用于在MTLModel对象和JSON字典之间进行相互转换,相当于是一个适配器。

MTLJSONSerializing

如果MTLModel的子类希望可以使用MTLJSONAdapter类做 Model 类与 JSON 字典间的转换,则必须实现MTLJSONSerializing协议

@required
+ (NSDictionary *)JSONKeyPathsByPropertyKey;
@optional
+ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key;
+ (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary;

+ (NSDictionary *)JSONKeyPathsByPropertyKey

此方法必须实现。这个方法返回的字典,定义了 Model 类的属性名与 JSON 字典键的映射,在这个返回的字典中,Model 类的属性名作为键,JSON 字典的键作为值。(当你的 Model 里的所有属性的名字和 JSON 里的所有 key 的名字完全相同的时候,你就可以用[NSDictionary mtl_identityPropertyMapWithModel:]这个方法直接生成一个 NSDictionary, 直接返回。)

+ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key

这个方法返回一个NSValueTransformer对象,可以实现 Model 类与 JSON 字典间互相转换时,改变原始数据类型。例如,代表 JSON 字典中用户信息类的值一般为字典,而在 Model 类中对应的 property 一般为 OC 对象,此时就可以在该方法中实现转换的逻辑。该方法传入的参数 key,为 Model 类的属性名,而不是 JSON 字典的键值。如果 Model 类实现了+JSONTransformer方法(key为 Model 类的属性名),则该方法会替代+ JSONTransformerForKey:方法被调用。

+ (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary

如果有一个类簇,基类或抽象类可以实现方法+ classForParsingJSONDictionary:,根据传入的需要转换的 JSON 字典,可以指定生成具体的对应 Model 子类。

Mantle的核心操作步骤

  1. 获取 model 的属性--> JSONKeyPath 映射字典
  2. 获取 model 的属性列表
  3. 根据 model 的方法给网络请求中返回的 JSON 字典中的 value 做值类型转化操作
  4. 使用 KVC 把值赋给 model 的属性,完成操作

Matnle的类的组织架构
按照文件的方式,
MTLJSONAdapter.h,定义了协议MTLJSONSerializing和适配器类MTLJSONAdapter,这两个协议/类定义了接口来实现JSON-MTLModel的转换。
MTLModel.h,定义了协议MTLModel和基类MTLModel,基类MTLModel实现了isEqual,NSCopying和hash几个方法。
MTLModel+NSCoding.h,MTLModel的类别,让其支持NSCoding协议
MTLValueTransformer.h,NSValueTransformer的子类,定义了将一个value转变成另一个value的接口。例如,返回的一个2020-01-01T15:33:30字符串,利用转换block转换成NSDate
其它的都是工具类,提供工具方法,不全列出来了。

Mantle除了提供JSON和对象的相互转化,继承自MTLModel的对象还自动实现了
NSCopying
NSCoding
isEqual
hash
等几个工具方法。

技术点总结
Mantle的功能主要是进行对象间数据的转换:即如何在一个MTLModel和一个JSON字典中进行数据的转换。因此,所使用的技术大都是Cocoa Foundation提供的功能。除了对于Core Data的处理之外,主要用到的技术的有如下几条:
1 KVC的应用:这主要体现在对MTLModel子类的属性赋值中,通过KVC机制来验证值的有效性并为属性赋值。
2 NSValueTransform:这主要用于对JSON值转换为属性值的处理,我们可以自定义转换器来满足我们自己的转换需求。
3 NSInvocation:这主要用于统一处理针对特定key值的一些方法的调用。比如-mergeFromModel:这一类方法。
4 Run time函数的使用:这主要用于对从一个字符串中获取到方法对应的字符串,然后通过sel_registerName函数来注册一个selector。

你可能感兴趣的:(数据模型解析工具Mantle分析)