深入浅出Runtime (五) Runtime的实际应用之一,字典转模型

引言

在我们开发中,经常使用数据模型,模型分为:本地缓存模型、网络下载模型、以及一些临时存储模型,其中网络数据模型需要工程师将服务器的数据序列化,在网络模型赋值的时候,我们所要做的方式有两种:

  • 自己设计数据模型,将网络中的数据,手动一一对应的形式赋值给自己定义的模型

优点: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 
#import 
@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

你可能感兴趣的:(深入浅出Runtime (五) Runtime的实际应用之一,字典转模型)