上周将Mantle替换为MJExtension,这周简单看看MJExtension大概是个流程
mj代码跟踪
首先入口一般是mj_objectWithKeyValues:(id)keyValues 转到 mj_objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext);
mj_objectWithKeyValuescontext为nil 直接看mj_setKeyValues:(id)keyValues;
mj_setKeyValues-1MJProperty分类中 + (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
网友评论