方法一:

//
// AlinkDeviceInfo.m
////
// Created by Vivien on 2018/10/12.
// Copyright © 2018年 . All rights reserved.
// #import "AlinkDeviceInfo.h"
#import <objc/runtime.h>
@implementation AlinkDeviceInfo - (void)setModels
{
//获取当前类
id infoClass = [self class];
unsigned int count = ;
Ivar *members = class_copyIvarList([infoClass class], &count); //获取属性列表
for (int i = ; i < count; i++) { //遍历属性列表
Ivar var = members[i];
const char *memberType = ivar_getTypeEncoding(var); //获取变量类型
NSString *typeStr = [NSString stringWithCString:memberType encoding:NSUTF8StringEncoding];
if ([typeStr isEqualToString:@"@\"NSDictionary\""]) { //判断类型是否为字典
const char *memberName = ivar_getName(var); //获取变量名称
[self setModelWithDicName:[NSString stringWithCString:memberName encoding:NSUTF8StringEncoding] channel:IOTBaseModelValueChangedChannel_Get];
}
}
} /**
给iOT对象赋值
将NSDictionary对象解析并赋值给对应的IOTBaseModel
eg:
NSString *jsonStr = _Speed[@"value"];
NSDictionary *modelDict = [self dictionaryWithJsonString:jsonStr];
_iOTSpeed = [IOTSpeed mj_objectWithKeyValues:modelDict]; */
- (void)setModelWithDicName:(NSString *)name channel:(IOTBaseModelValueChangedChannel )channel //channel:IOTBaseModelValueChangedChannel_Push
{
NSString *dicName = [self addLineToName:name]; //_Dic
NSMutableString *_iOTName = [[NSMutableString alloc]initWithString:dicName];
[_iOTName replaceCharactersInRange:NSMakeRange(, ) withString:@"_iOT"]; //_iOTXXX
Ivar iotIvar = class_getInstanceVariable([self class], [_iOTName UTF8String]); //IOTBaseModel [_iOTName deleteCharactersInRange:NSMakeRange(, )]; //iOTName SEL iotGetSEL = NSSelectorFromString(_iOTName);
if ([self respondsToSelector:iotGetSEL]) { //存在对应的iOT对象 Ivar ivar = class_getInstanceVariable([self class], [dicName UTF8String]); //字典对象 NSDictionary *tempDic = object_getIvar(self, ivar);
if(tempDic){
NSString *jsonStr = tempDic[@"value"];
NSDictionary *modelDict = [self dictionaryWithJsonString:jsonStr]; NSMutableString *modelName = [[NSMutableString alloc]initWithString:[self upperPropertyName:_iOTName]];
Class modelClass = NSClassFromString(modelName);
NSLog(@"tempDic::%@,modelDict:%@,iOTName:%@,modelName:%@", tempDic,modelDict,_iOTName,modelName); id tempObj = [modelClass mj_objectWithKeyValues:modelDict];
object_setIvar(self, iotIvar, tempObj); if (channel == IOTBaseModelValueChangedChannel_Push ) {
IOTBaseModel *model = object_getIvar(self, iotIvar);
[SharedGLBRobotResponseHandler onRobotResponse:CURRENT_ACTIVE_ROBOT value:model key:[model lowerPropertyName:NSStringFromClass(model.class)] channel:IOTBaseModelValueChangedChannel_Push];
} }
}
} - (NSString *)addLineToName:(NSString *)name
{
NSMutableString *resultStr = [[NSMutableString alloc]initWithString:name];
NSString *firstChar = [resultStr substringToIndex:];
if (![firstChar isEqualToString:@"_"] ) {
[resultStr insertString:@"_" atIndex:];
} return resultStr;
} - (NSString *)upperPropertyName:(NSString *)className
{
NSMutableString * key = [[NSMutableString alloc]initWithString:className];
NSString *firstChar = [key substringToIndex:];
[key replaceCharactersInRange:NSMakeRange(, ) withString:[firstChar uppercaseString]];
return key;
}
//解析
- (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString
{
if (jsonString == nil) {
return nil;
} NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
if(err)
{
NSLog(@"json解析失败:%@",err);
return nil;
}
return dic;
} -(id)valueForUndefinedKey:(NSString *)key
{
NSLog(@"你有get方法没实现,key:%@",key);
return nil;
}
-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{
NSLog(@"你有set方法没实现,key:%@",key);
} @end

这样子有个问题:

 Ivar ivar = class_getInstanceVariable([self class], [dicName UTF8String]);  //字典对象

获取不到Category中的属性
- (void)setModels
{ NSArray *keys = [self getProperties];
//(2)根据类型给属性赋值
for (NSString * key in keys) {
NSMutableString *_iOTName = [[NSMutableString alloc]initWithString:[self addLineToName:key]];
[_iOTName replaceCharactersInRange:NSMakeRange(, ) withString:@"_iOT"]; //_iOTXXX [_iOTName deleteCharactersInRange:NSMakeRange(, )]; //iOTName SEL iotGetSEL = NSSelectorFromString(_iOTName);
if ([CURRENT_ACTIVE_ROBOT respondsToSelector:iotGetSEL]) { //存在对应的iOT对象
Ivar ivar = class_getInstanceVariable([self class], [[self addLineToName:key] UTF8String]); //字典对象
NSDictionary *tempDic = object_getIvar(self, ivar);
if(tempDic){
NSString *jsonStr = tempDic[@"value"];
NSDictionary *modelDict = [self dictionaryWithJsonString:jsonStr];
NSMutableString *modelName = [[NSMutableString alloc]initWithString:[self upperPropertyName:_iOTName]];
Class modelClass = NSClassFromString(modelName);
id tempObj = [modelClass mj_objectWithKeyValues:modelDict];
[CURRENT_ACTIVE_ROBOT setValue:tempObj forKey:_iOTName];
NSLog(@"EcoAllRobot:%ld,%ld",CURRENT_ACTIVE_ROBOT.iOTSpeed.speed,CURRENT_ACTIVE_ROBOT.iOTBreakPoint.enable);
NSLog(@"tempDic::%@,modelDict:%@,iOTName:%@,modelName:%@", tempDic,modelDict,_iOTName,modelName);
}
}
} }

批量操作RunTime之获取的Dic换成Model的更多相关文章

  1. JS代码获取当前日期时支持IE,不兼容FF和chrome,解决这个问题,我们需要把获取时间的getYear()函数换成getFullYear()

    以前在页面中获得当前时间的方法如下: function SelectTodayClient() { var d = new Date(); var taday = d.getYear() + &quo ...

  2. php 接收二进制流转换成图片

    php 接收二进制流转换成图片,图片类imageUpload.php如下: <?php /** * 图片类 * @author http://blog.csdn.net/haiqiao_2010 ...

  3. SQL Where in (1,2,3,4) 换成字段一列的值

    ) ; , ) ) FROM r_resource WHERE id IN ( @resource) 换成 ) : , ) ) FROM r_resource )) SELECT cid,id FRO ...

  4. 将几何画板x轴坐标值换成弧度制的方法

    大家在学习数学的过程中,都会遇到函数,这个时候大家都会遇到函数图像.对于函数图像我们一般都会通过先建立坐标系,然后让图像呈现在坐标系中.函数的种类有很多,三角函数就是其中之一,在绘制三角函数图像时,我 ...

  5. Win8换成Win7系统问题小结(修改主板BIOS方法)

    问题描述: 笔记本电脑W8系统使用不习惯,想要换成W7系统,但不管是用光盘安装亦或是用U盘安装,在设置系统启动项的时候,选择从光盘启动或从U盘启动,但是回车点了之后没反应. 下面就说说问题的原因及解决 ...

  6. php 把数字1-1亿换成汉字表述,例如 150 转成 一百五十

    /* 额,重新修改了下.现在估计没什么问题了.... */ 直接上实例 写到 千亿上了. /** * @author ja颂 * 把数字1-1亿换成汉字表述,如:123->一百二十三 * @pa ...

  7. 【代码笔记】iOS-把<br!>换成\n

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // ...

  8. iOS: 上传App到AppStore,由于Xcode上传太慢,换成Application Loader上传,速度秒传

    一.遇到的遭遇 在之前的项目开发中,本人有点固执,一直采用xcode打包后再上传,结果可想而知: (1)要么上传时速度慢的跟蜗牛似的,等的我心力交瘁(不排除网络不给力的原因,公司这个吊问题快把我气疯了 ...

  9. svn的差异查看器和合并工具换成BCompare.exe

    svn的差异查看器和合并工具换成BCompare.exe

随机推荐

  1. 11.14 redis

    2018-11-14 10:07:39 购物车有思路,用django中redis来做!!!具体思路参考下面笔记 回学校后,把笔记里面面试题都认真整理一下!!!!!! 越努力,越幸运!永远不要高估自己! ...

  2. 第六天 py 加法练习

    其实就是while的用法!   该看第65 啦

  3. jquery面试(2)

    DOM操作——怎样添加.移除.移动.复制.创建和查找节点? (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体 ...

  4. PHP中递归的实现(附例子)

    递归函数是一种调用自己的函数.写递归函数时要小心,因为可能会无穷递归下去.必须确保有充分的方法来终止递归. 一:使用参数引用完成递归函数.操作的是同一块内存地址. <?php $i=1; fun ...

  5. Spring-boot(二)--thymeleaf

    @Controller @RequestMapping("/") public class MessageController { private final MessageRep ...

  6. Spring-Boot自动装载servlet

    Spring-Boot自动装载servlet 本人spring-boot相关博客均自己手动编写,但技术均从简书 恒宇少年 处学习,该大佬一直是我的偶像,鉴于能充分理解,所以已做笔记的方式留下这些文档, ...

  7. Python 学习笔记1 安装和IDE

    前面的话 现在随着互联网的快速发展,对测试人员的代码要求也越来越高.有种逐步往全栈开发人员发展的趋势. 越来越多的手工测试被自动化取代. 对于测试人员,学习一门开发语言迫在眉睫. C#, JAVA, ...

  8. 分库分表、读写分离——用Sql和ORM(EF)来实现

    分库:将海量数据分成多个库保存,比如:2017年的订单库——Order2017,2018年的订单库——Order2018... 分表:水平分表(Order拆成Order1.....12).垂直分表(O ...

  9. 把vim改装为source sight

    本文在ubuntu18.04上实践. 主要为VIM 安装4个插件: taglist,srcexpl,NERD_tree,ctrlp 1,taglist.vim :https://www.vim.org ...

  10. POJ3461 Oulipo 字符串

    正解:kmp/哈希 解题报告: 传送门! 这题其实就kmp板子,,,用来复习下kmp的太久没打了QAQ 所以kmp做法就不港了放个代码就是了QAQ #include<algorithm> ...