美文网首页
数据模型解析工具Mantle分析

数据模型解析工具Mantle分析

作者: sun_glory | 来源:发表于2020-05-02 15:12 被阅读0次

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

    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 类实现了+<key>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值的一些方法的调用。比如-merge<Key>FromModel:这一类方法。
    4 Run time函数的使用:这主要用于对从一个字符串中获取到方法对应的字符串,然后通过sel_registerName函数来注册一个selector。

    相关文章

      网友评论

          本文标题:数据模型解析工具Mantle分析

          本文链接:https://www.haomeiwen.com/subject/jkrtghtx.html