runtime使用技巧二

接着上一篇讲解runtime反射属性的用法

runtime反射属性列表:

  在很多时候,Android和IOS经常需要在程序中生成一个列表,并且列表中数据格式什么的基本相同。Android还好一点,谷歌的Gson很完美的解决了解析的问题.
前提是你需要生成一个跟你的借口返回数据完全相同的model,这在Android开发中是提高速率非常简洁有效的方法,并且减少了自用解析的繁琐过程和中间出现的一些问题。

  但在IOS中我们经常在http之后获得的数据为字典型的,如何把字典型的array转变为model型的array(方便给cell赋值,相信大家都懂得)就成为一个非常“痛苦的过程”,数据少还好一点,数据多得时候。。。
这种过程既没有技术含量,而且是繁复的必须的。那么怎么样来解决这个问题那。下面进入今天的话题: IOS类GSON处理

首先我在NSDictionary的类别中申明一个方法

#import <objc/runtime.h>
记得添加,人家是主角

@interface NSDictionary (getModelArray)
-(NSMutableArray *)getModelWithKey:(NSString *)key ClassName:(NSString *)name;
@end

然后我们。。。直接上代码


@implementation NSDictionary (getModelArray)

-(NSMutableArray *)getModelWithKey:(NSString *)key ClassName:(NSString *)name{
unsigned int outCount, i,j;
objc_property_t *properties = class_copyPropertyList(NSClassFromString(name), &outCount);
NSMutableArray * arr = [NSMutableArray arrayWithArray:[self valueForKey:key]];
NSMutableArray * arrResult = [[[NSMutableArray alloc] init] autorelease];
for (i=0;i<arr.count;i++) {
id obj = [[NSClassFromString(name) alloc] init];
for (j=0; j<outCount; j++) {
objc_property_t property = properties[j];
NSString * keyName = [[NSString alloc]initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
[obj setValue:[[arr objectAtIndex:i] valueForKey:keyName] forKey:keyName];
[keyName release];
}
[arrResult addObject:obj];
[obj release];
}
NSLog(@"\n成功转换实体类:%@\n关键字:%@\n数量:%d",name,key,arrResult.count);
return arrResult;
}

然后在从http请求回来之后,对字典调用
上面该方法,传入想要解析的字典中array的key值,和想要转换得model类型的名称,然后你就会得到一个array,而里面全是你需要的model是不是很爽呢。。。注意:model中得属性需要和接返回的属性名称保持一直,不然model中得会出现有的值为nil
 。。

附下效果

在http之后调用

if (![[dic valueForKey:@"delegatess"] isKindOfClass:[NSNullclass]]) {

self.arrData = [dic getModelWithKey:@"delegatess"ClassName:@"AgentDetailsModel"];

}

2014-05-07 13:46:16.761
SouFun[4433:90b] 

成功转换实体类:AgentDetailsModel

关键字:delegatess

数量:1

时间: 2024-10-05 00:09:07

runtime使用技巧二的相关文章

思科命令配置小技巧二:macro命令

在 思科命令配置小技巧一中,我们谈到,使用range命令可以简化我们的配置 但是如果我们经常对一组不连续的端口进行操作 比如 interface-range  fa1/1 ,fa1/3 ,fa1/5 ,fa1/7 ,fa1/11 即使使用range命令也会显得很繁琐 我们总想越简单越好(命令敲再多,工资还是那个数,要是按命令字数算工资多好) 此时交换机的宏命令就派上用场了 suzhouxiaoniu(config)#define interface-range abc fa1/1 ,fa1/3

CSS技巧二

元素缩写 font中属性的放置顺序是严格遵守的,否则不会生效. Font:font-style font-weight font-size font-familiy;(注:font-size和font-family是font的必须属性,并且font-size一定要放在font-family的前面) Margin:margin-top margin-right margin-bottom margin-bottom ; Padding:padding-top padding-right paddi

SQL开发技巧(二)

本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上…… 文章系列目录 SQL开发技巧(一) SQL开发技巧(二) 本文内容简介 这篇文章主要介绍以下内容: 快速查询表的总记录数 非递归查询树形结构表的所有子节点 清除查询缓存 编程中构建Where语句的小技巧 如何进行跨服务器的数据库查询 快速查询表的总记录数 什么,你还在用select count(*) from xxx?难道没有园友告诉你用se

Eclipse用法和技巧二十八:Eclipse插件Easy Explore的今世

先说明一下easyexplore插件的功能,easyexplore是一个类似于 Windows Explorer的Eclipse插件,它可以帮助你在不退出Eclipse的环境下迅速浏览本地文件系统. 具体可以看图: 前一阵子项目组来了一批新员工,在配置开发环境的时候,发现有的员工可以安装easyexplore插件,有的安装无效.经过分析发现,有的员工用的Eclipse是从Android开发网站上下载的,adt-bundle-windows包里面的,Eclipse的版本是JUNO版本,有的员工的E

Eclipse用法和技巧二十四:当git遇上eclipse

git是非常优秀的代码管理工具,eclipse是非常不错的,免费的IDE.工作中两者碰到一起,有点麻烦了:eclipse对于每个项目会生成一些特定的文件,而这些文件又不是项目必须的,并且每个人的配置是不一样的,所以这些文件不好放入版本库随代码统一管理.刚开始的时候,本人是在执行 git add 或者git reset这些命令的时候指定文件,这个就没有直接来 git add .这样的命令方便了.接下来就介绍一个一劳永逸的方法:        步骤一:进入当前项目仓库的.git目录,进入info目录

Eclipse用法和技巧二十五:eclipse图标的含义

用了eclipse很久,在使用断点调试的时候才开始关注图标的含义.这才发现eclipse的图标还是很丰富的,熟悉的知道每个图标的含义还是蛮不错的,尤其是在断点调试中.eclipse自带了详细的图标说明,下面来看看怎么打开这个说明:       步骤一:打开Help -> Tips and Tricks        步骤二:打开Java development user guide -> Reference -> icons 这样就可以看到了eclipse的所有图标说明了,当然在步骤二中

Eclipse用法和技巧二十:一个快速打印技巧

调试的时候经常用到打印语句,当需要添加的说明字符串和需要打印的数值混淆到一起的时候,需要先写字符串如,"the string here is",接着再输入变量的值.这样一来一去还是比较麻烦的.下面介绍一种方法,可以大大的提高效率.        步骤一:假定需要打印temp的值,先输入完整的打印字符串: 步骤二:选中temp,按住神键Ctrl+1: 步骤三:选择提示选项,在删除双引号即大功告成.在需要打印的变量混淆在提示字符串中,这个方法能大大加快输入速度. 上一篇文章,Eclipse

Eclipse用法和技巧二十七:定义自己的快速联想词

某天在调试代码的时候,虽然是android的project还是习惯的输入syso,然后在ALT+/一下.旁边的同事就问了一下,这个log打印输出的tag是什么.接着又问了为什么syso能够智能联想出这个.第一个问题很好回答,不过对于第二个问题还真答不上来.大学里面第一次见某个学长使用这个技能之后,就默默的记住了,也没有多想是什么回事.这两天留意了一下,原来是类似java代码模版的一个东东.在一想为什么不自己定义android的联想词呢...        步骤一:打开preference,搜索e

Linux Shell常用技巧(二)

七. grep家族:       1.  grep退出状态:    0: 表示成功:    1: 表示在所提供的文件无法找到匹配的pattern:    2: 表示参数中提供的文件不存在.    见如下示例:    /> grep 'root' /etc/passwd    root:x:0:0:root:/root:/bin/bash    operator:x:11:0:operator:/root:/sbin/nologin    /> echo $?    0        />