美文网首页
MJExtension代码跟踪

MJExtension代码跟踪

作者: 不动科气坏了 | 来源:发表于2019-02-25 17:06 被阅读0次

    上周将Mantle替换为MJExtension,这周简单看看MJExtension大概是个流程

    mj代码跟踪

    首先入口一般是mj_objectWithKeyValues:(id)keyValues 转到 mj_objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext);

    mj_objectWithKeyValues

    context为nil 直接看mj_setKeyValues:(id)keyValues; 

    mj_setKeyValues-1

    MJProperty分类中 + (void)mj_enumerateProperties:(MJPropertiesEnumeration)enumeration是封装的一个遍历方法,

    mj_enumerateProperties

    方法中[self properties] 获取模型的属性,会先从缓存中取出 以当前类为key、MJProperty数组为value的字典,若无则反复遍历自己编写的类及父类 取出其中的所有成员

                    unsignedint outCount =0;

                    objc_property_t *properties =class_copyPropertyList(c, &outCount);

    properties

    然后遍历所有成员变量,将成员变量封装成MJProperty,MJProperty添加关联对象到self中:

    cachedPropertyWithProperty

    之后为MJProperty设置所属类,设置key(可能会替换)

    + (id)propertyKey:(NSString *)propertyName

    查看是否有需要替换的propertyName,用propertyName作为OriginKey

    setOriginKey

    包装后的MJProperty 加入cachedProperties 保存cache。

    再回到MJKeyValue分类setKeyValues中,遍历cacheProperties中的MJProperty。以类名为Key取出propertyKey列表,遍历propertyKey列表,用propertyName为property从KeyValues中取值,取出的value即为model中属性对应的值,该值需要进行新旧值替换、类型转换(如不可变类转换为可变类类,url转换为string number转换bool转换等)等,遍历完毕就判断是否有实现mj_keyValuesDidFinishConvertingToObject方法执行。

    mj_setKeyValues

    平时用的另一种就是对象数组字典转换了,其实也是一样的,多一层遍历,将model加入数组中:

    mj_objectArrayWithKeyValuesArray

    相关文章

      网友评论

          本文标题:MJExtension代码跟踪

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