Foundation框架(5)字典转模型
字典对象与模型对象的转换
从本地或者网络获取的数据,往往都是字典类型的。
这些字典数据往往字段固定,且以数组的形式存储。
使用字典可能会带来一些不利:
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
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。