利用Runtime运行机制(消息机制)快速实现JSON到数据模型的转换

现在的ios开发中,我们通常会使用MVC模式。当我们拿到数据的时候,我们要把数据转成模型使用。

一般情况我们拿到的数据都是字典。这是我们就需要将字典转成模型对象了。

当对象的属性很少的时候,我们可以直接单独写出字典的键值,进行转换。

_属性 = dict["键"]

当对象的属性很多的时候,我们可以利用KVC批量设置。

setValuesForKeysWithDictionary:<#(NSDictionary *)#>

但是KVC批量转的时候,有个致命的缺点,就是当字典中的键,在对象属性中找不到对应的属性的时候

会报错。

这个时候,我们不妨反过来想一下。我们先获取到对象所有的属性名,然后加入到一个数组里面,然后再遍历,赋值。

在程序运行的时候,抓取对象的属性,这时候,要利用到运行时机制了,详情见下面的代码

+ (NSArray *)propertyList {

//0. 判断是否存在关联对象,如果存在,直接返回

/**

1> 关联到的对象

2> 关联的属性 key

提示:在 OC 中,类本质上也是一个对象

*/

NSArray *pList =objc_getAssociatedObject(self, propertiesKey);

if(pList !=nil) {

return pList;

}

//1. 获取`类`的属性

/**

参数

1> 类

2> 属性的计数指针

*/

unsigned int count =0;

//返回值是所有属性的数组 objc_property_t

objc_property_t *list = class_copyPropertyList([self class], &count);

NSMutableArray *arrayM =[NSMutableArray arrayWithCapacity:count];

//遍历数组

for(unsigned int i =0; i < count; ++i) {

//获取到属性

objc_property_t pty =list[i];

//获取属性的名称

const char *cname =property_getName(pty);

[arrayM addObject:[NSString stringWithUTF8String:cname]];

}

NSLog(@"%@", arrayM);

//释放属性数组

free(list);

//设置关联对象

/**

1> 关联的对象

2> 关联对象的 key

3> 属性数值

4> 属性的持有方式 retain, copy, assign

*/

objc_setAssociatedObject(self,propertiesKey,arrayM,OBJC_ASSOCIATION_COPY_NONATOMIC);

return arrayM.copy;

}

上面的代码中,有两段 判断是否有关联对象,和 设置关联对象的代码。是为了不重复执行此方法。


在获取到上面的属性数组之后,可以写字典转模型的方法了

+ (instancetype)objectWithDict:(NSDictionary *)dict {

id obj =[[self alloc] init];

// [obj setValuesForKeysWithDictionary:dict];

NSArray *properties =[self propertyList];

//遍历属性数组

for(NSString *key in properties) {

   //判断字典中是否包含这个key

   if(dict[key] !=nil) {

   //使用 KVC 设置数值

   [obj setValue:dict[key] forKeyPath:key];

   }

}

return obj;

}

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

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 2,158评论 0 9
  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,834评论 7 64
  • 一、runtime简介 RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消...
    沁晓Chr阅读 600评论 0 5
  • OC最实用的runtime总结,面试、工作你看我就足够了! 前言runtime的资料网上有很多了,部分有些晦涩难懂...
    small_Sun阅读 993评论 1 12
  • 和又土一起三年了,这三年里我再也没有喝过绿豆汤。又土的背影消失后,我在院里支起桌凳,煮酒抚琴,弹一曲歌一曲,酒一杯...
    春花细白阅读 166评论 0 0

友情链接更多精彩内容