Fork me on GitHub

iOS第三方库背后的原理和简单使用

https://cdn.pixabay.com/photo/2018/01/16/23/37/sunset-3087145__340.jpg

在我们平时的开发中,或多或少都会使用到一些开源库,在小公司甚至大量依赖第三方,那么我们对一些知名第三方是否有必要了解下它背后的原理呢,甚至应该阅读一些知名第三方的底层实现和原理,下面就简单介绍一些第三方的实现原理和简单的使用方法吧。

MJExtension

MJExtension

基本使用

json -> Model

1
2
3
4
5
// json -> Model 
+ (instancetype)mj_objectWithKeyValues:(id)keyValues;

// json -> Model 数组
+ (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray;

Model -> json

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 转换为JSON Data
*/
- (NSData *)mj_JSONData;
/**
* 转换为字典或者数组
*/
- (id)mj_JSONObject;
/**
* 转换为JSON 字符串
*/
- (NSString *)mj_JSONString;

其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*数组中需要转换的模型*/
+ (NSDictionary *)mj_objectClassInArray{
return @{
@"array1": BMImageInfoModel.class,
};
}

/*key 重命名 属性名为key : json 中的key为 value */
+ (NSDictionary *)mj_replacedKeyFromPropertyName {
return @{
@"desc": @"description",
@"ID": @"id",
};
}

/*json -> Model 完成时*/
- (void)mj_keyValuesDidFinishConvertingToObject {
}

/*Model -> json 完成时*/
- (void)mj_objectDidFinishConvertingToKeyValues {
}

原理

  1. 我们知道 json->Model时,其实就是在dict中取对应的值然后设置到Model中, obj.name = dict[@"name"]; 我们知道Model中的属性一般是非常多的,而且一个项目中Model也是非常多,而且Model中的属性随时可能变动,像上面的赋值代码就会成千上万,而且非常不好维护,那么我们有没有快捷的方法解决好这些问题呢?MJExtension就是为我们解决了这些问题的一个库而且可以扩展许多功能。不管你有多少属性只需要mj_objectWithKeyValues这样一行代码完美搞定。

  2. 在上面的分析中我们肯定要想办法动态的获取Model中的属性,同时去dict中取相应的值设置给Model相应的属性,其实MJExtension的核心功能就是解决这个问题,MJExtension使用Runtime动态地的获取模型的属性,然后动态的在dict中取相应的值设置给Model,当然其中做了特别多的优化和扩展。

  3. 动态获取模型的属性

NSObject+MJKeyValue.m 文件 87 行的如下代码

1
[clazz mj_enumerateProperties:^(MJProperty *property, BOOL *stop)...
  1. 使用KVC赋值

NSObject+MJKeyValue.m 文件 189 行的如下代码

1
2
// 3.赋值
[property setValue:value forObject:self];

此方法内部如下(NSObject+MJKeyValue.m 文件78行):

1
2
3
4
5
6
7
8
/**
* 设置成员变量的值
*/
- (void)setValue:(id)value forObject:(id)object
{
if (self.type.KVCDisabled || value == nil) return;
[object setValue:value forKey:self.name];
}

基本功能的代码基本就是上面的代码段,当然有大量的优化和扩展防错等功能未展开。

  1. 支持模型的继承属性,比如:Model的父类有一个name属性,那么在转换时会支持name属性的获取
  2. 对一些特殊类型做了特殊处理,比如:BOOL类型等
  3. 支持模型嵌套模型转换
  4. 支持模型嵌套数组转换,如果数组中的对象是模型需实现相应协议
  5. 支持指定属性名称支持转换和指定属性名称不支持转换
  6. 只对属性有效
  7. 支持readonly属性
  8. 对Model的属性做了缓存大幅度增加性能
  9. 添加一些扩展方法,Model->jsonData, Model->json, Model->dict
  10. json(NSData dict,NSString)->模型
  11. json(NSData arr,NSString)->模型数组
  12. 获取到模型的属性列表时做缓存
  13. 内部使用KVC赋值

YYModel

YYCache

UITableView-FDTemplateLayoutCell

- END -
扫一扫上面的二维码图案,加我微信

文章作者:梁大红

特别声明:若无特殊声明均为原创,转载请注明,侵权请联系

版权声明:署名-非商业性使用-禁止演绎 4.0 国际