字典对象与模型对象的转换

从本地或者网络获取的数据,往往都是字典类型的。

这些字典数据往往字段固定,且以数组的形式存储。


使用字典可能会带来一些不利:

1. key不方便记忆且编译器不进行正确性的验证

2. 不能进行一些对象的操作


解决的方法是:

将固定字段的字典,封装成自定义的对象,这种对象我们称之为“模型”。


字典转模型的步骤

1)创建模型类

属性名应为对应词典中的key字符串中的名字

属性类型应为词典中对应value的类型。

如:字典来自plist文件

@interfaceAMMusicModel:NSObject@property(nonatomic)NSString*song;@property(nonatomic)NSString*singer;@end

2)添加init及类方法创建模型类

@interfaceAMMusicModel:NSObject@property(nonatomic)NSString*song;@property(nonatomic)NSString*singer;-(instancetype)initWithDictionary:(NSDictionary*)dict;+(instancetype)modelWithDictionary:(NSDictionary*)dict;@end

3)将字典转成模型对象,用属性存储

-(instancetype)initWithDictionary:(NSDictionary*)dict{if(self=[superinit]){self.song=dict[@"dict"];self.singer=dict[@"singer"];}returnself;}+(instancetype)modelWithDictionary:(NSDictionary*)dict{return[[selfalloc]initWithDictionary:dict];}

4)在持有模型对象的类中添加属性,往往是数组

@interfaceAMMusicListModel:NSObject@property(nonatomic)NSMutableArray*musicArray;@end

并在适合的位置,创建该数组:

NSString*path=@".../music.plist";NSArray*plistArray=[NSArrayarrayWithContentsOfFile:path];self->_musicArray=[NSMutableArrayarray];for(NSDictionary*dictinplistArray){AMMusicModel*model=[AMMusictModelmodelWithDictionary:dict);[self->_musicArrayaddObject:model];}


懒加载

是一种延迟加载方式,在需要的时候才加载

是一种内存调优的手段,能够在一定程度上减少不必要内存的使用

具体做法:重写属性的getter方法

-(NSMutableArray*)musicArray{if(_musicArray==nil){NSString*path=@".../music.plist";NSArray*plistArray=[NSArrayarrayWithContentsOfFile:path];self->_musicArray=[NSMutableArrayarray];for(NSDictionary*dictinplistArray){AMMusicModel*model=[AMMusictModelmodelWithDictionary:dict);[self->_musicArrayaddObject:model];}}return_musicArray;}



KVC

Key Value Coding,键值编码协议NSKeyValueCoding,提供一种机制来间接访问对象的属性。

获得值:

-(id)valueForKey:(NSString*)key

设置值:

-(void)setValue:(id)valueforKey:(NSString*)key

路径访问方式:

存在复合关系时,通过 . 将属性名连接成路径访问

如下图,对象employee1中 包含属性manager ,而manager中包含其他属性

可以通过路径字符串 @”manager.employee1”访问

-(id)valueForKeyPath:(NSString*)keyPath-(void)setValue:(id)valueforKeyPath:(NSString*)keyPath


意义:

1)提供了对象属性的另一种有效的访问方式

2)为KVO提供了实现基础

...


模型转字典

模型对象使用NSKeyValueCoding协议中的方法进行转换

-(NSDictionary<NSString*,id>*)dictionaryWithValuesForKeys:(NSArray<NSString*>*)keys