引言
在我们开发中,经常使用数据模型,模型分为:本地缓存模型、网络下载模型、以及一些临时存储模型,其中网络数据模型需要工程师将服务器的数据序列化,在网络模型赋值的时候,我们所要做的方式有两种:
- 自己设计数据模型,将网络中的数据,手动一一对应的形式赋值给自己定义的模型
优点:1.设计的模型根据自己的代码架构来实现 2.在迭代过程当中会更顺畅、更清楚业务逻辑、方便修改、更加灵活
缺点:1.开发周期会变慢 2.每次改动的时候都需要自己手动处理模型
- 数据转模型,根据服务器返回的数据规格,转换成字典,在根据字典key=property(Name)的形式设计数据模型用runtime的形式一键生成实例数据模型(已赋值过后的数据模型)
优点:1.敏捷式开发 2.添加新的数据时会更方便
缺点:1.严重依赖于服务器约定的数据规格 2.服务器数据改动会增加代码的工作量
我在序言中讲了这么多干哈?
在实际开发中还是看实际情况而定,而不是我就认定哪种好用哪个,在需求不明确,数据不精简的情况下,我的建议还是使用自建模型
今天重点要看的是字典怎么转换成模型
简单的字典转模型
首先初始化一个字典
NSDictionary *dicTest = @{@"Name":@"飞翔",
@"Type":@"励志",
@"Des":@"我要飞翔追逐梦想!",
@"Motto":@"脚踏实地一步一个脚印!"
};
看到这种情况下,根据key来记录Property的属性名称创建一个模型
@interface MyGame : NSObject
@property(nonatomic,copy)NSString *Name;
@property(nonatomic,copy)NSString *Type;
@property(nonatomic,copy)NSString *Des;
@property(nonatomic,copy)NSString *Motto;
@end
再然后我们需要用Runtime来进行数据赋值,这个操作,我觉的最好的形式是放到NSObject的类扩展中去,当我们用到的时候将这个文件导入到数据模型中就可以直接使用
#import "NSObect+ThreegModel.h"
#import <objc/runtime.h>
#import <objc/message.h>
@implementation NSObject(ThreegModel)
+ (instancetype)GG_initWithDictionaryForModel:(NSDictionary *)dic{
id myObj = [[self alloc] init];
unsigned int outCount;
//获取类中的所有成员属性
objc_property_t *arrPropertys = class_copyPropertyList([self class], &outCount);
for (NSInteger i = 0; i < outCount; i ++) {
//获取属性名字符串
objc_property_t property = arrPropertys[i];
//model中的属性名
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
id propertyValue = dic[propertyName];
if (propertyValue != nil) {
[myObj setValue:propertyValue forKey:propertyName];
}
}
//注意在runtime获取属性的时候,并不是ARC Objective-C的对象所有需要释放
free(arrPropertys);
return myObj;
}
@end










网友评论