美文网首页
MJExtension 源码阅读

MJExtension 源码阅读

作者: DreamerZheng | 来源:发表于2015-12-14 18:23 被阅读1174次

近两天一直再看MJExtension这个框架,这个框架是用来实现字典和模型互转的。开发过程中,我们经常遇到这种情况,比如说,获取到网络的Json数据后,我们需要转化成模型进行分析,这样比直接用字典来分析好处多多。该框架提供了简单的方法来实现这一功能。
设计思路:
该框架的设计是通过分类来实现的,因为模型对象都是最终继承自NSObject,所以设计了一个关于NSObject的分类。
代码分析:
该框架的核心部分是这个方法:

- (instancetype)mj_setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context;

其中:keyValues是要转化的Json数据。
该方法首先进行的时:

    // 获得JSON对象
    keyValues = [keyValues mj_JSONObject];
// 判断是哪种类型的数据,使用相关方法进行转换,获得字典
- (id)mj_JSONObject
{
    if ([self isKindOfClass:[NSString class]]) {
        return [NSJSONSerialization JSONObjectWithData:[((NSString *)self) dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];
    } else if ([self isKindOfClass:[NSData class]]) {
        return [NSJSONSerialization JSONObjectWithData:(NSData *)self options:kNilOptions error:nil];
    }
    
    return self.mj_keyValues;
}

之后执行的方法当然就是遍历模型中的全部属性,参数是一个block

+ (void)mj_enumerateProperties:(MJPropertiesEnumeration)enumeration
{
    // 获得成员变量
    NSArray *cachedProperties = [self properties];
    
    // 遍历成员变量
    BOOL stop = NO;
    
    for (MJProperty *property in cachedProperties) {
        enumeration(property, &stop);
        if (stop) break;
    }
}

获得全部属性的方法是通过Runtime机制,读取了类中的属性列表。运行时库中提供了获得类的全部属性的方法:

// 返回一个指针数组,指针指向的是objc_property_t结构体
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)

// 属性
typedef struct objc_property *objc_property_t;
// 运行库里提供获得属性名字的方法
const char *property_getName(objc_property_t prop)
{
    return prop->name;
}
// 运行库里提供获得属性类型的方法
const char *property_getAttributes(objc_property_t prop)
{
    return prop->attributes;
}

之后遍历每一个属性,生成一个MJProperty对象,通过上面方法得到属性的名字和类型,该类型是一个对象,MJPropertyType。设置好相关属性后,添加进数组,执行完for循环,获得全部属性。

之后执行block中的内容,首先驱逐

相关文章

  • MJExtension框架源码分析

    MJExtension框架源码分析 MJExtension框架源码分析

  • MJExtension 源码阅读

    近两天一直再看MJExtension这个框架,这个框架是用来实现字典和模型互转的。开发过程中,我们经常遇到这种情况...

  • iOS源码阅读 —— MJExtension

    MJExtension是一款开源的,简单易用的字典与模型转换框架。常用的方法,主要是以下几个: 功能 JSON|字...

  • iOS开发MJExtension源码阅读笔记

    字典/JSON转模型用过MJExtension这个轻量级框架,现在重读MJExtension源码,顺便记录一下

  • MJExtension源码学习(二)

    接上篇MJExtension源码学习(一) 总览 这一次我们来看MJExtension最新版本的代码,当前最新为3...

  • MJExtension 源码浅析

    OC 项目中流行的字典转模型框架 ,出自CoderMJLee的开源框架 MJExtension 最近在阅读MJEx...

  • MJExtension源码解读

    MJExtension A fast, convenient and nonintrusive conversio...

  • MJExtension源码剖析

    MJExtension源码剖析( 3.0.13) 感觉学习东西最好还是先独立思考,亲自尝试写,然后再学习别人的源代...

  • MJExtension源码分析

    原始方法 实现我们的模型是这样的,只有2个属性 使用最原始的方法把json->Models时,代码如下 稍微优化下...

  • MJExtension源码解析

    A fast, convenient and nonintrusive conversion between JS...

网友评论

      本文标题:MJExtension 源码阅读

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