MJExtension 源码阅读

近两天一直再看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中的内容,首先驱逐

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,638评论 4 61
  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 9,111评论 7 64
  • 概述 ​ iOS源码解析—YYModel(YYClassInfo)分析了如何根据OC的Class对象构建...
    egoCogito_panf阅读 14,006评论 4 32
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 五一三天小长假像个鸡肋,不出去玩感觉是对假期的不尊重,出去到处人多车多,只不过是个加长版的周末。还是乖乖的陪儿子去...
    笑笑妈521阅读 1,486评论 0 2

友情链接更多精彩内容