字典对象与模型对象的转换
从本地或者网络获取的数据,往往都是字典类型的。
这些字典数据往往字段固定,且以数组的形式存储。
使用字典可能会带来一些不利:
1. key不方便记忆且编译器不进行正确性的验证
2. 不能进行一些对象的操作
解决的方法是:
将固定字段的字典,封装成自定义的对象,这种对象我们称之为“模型”。
字典转模型的步骤
1)创建模型类
属性名应为对应词典中的key字符串中的名字
属性类型应为词典中对应value的类型。
如:字典来自plist文件
@interface AMMusicModel : NSObject @property (nonatomic) NSString * song; @property (nonatomic) NSString * singer; @end
2)添加init及类方法创建模型类
@interface AMMusicModel : 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 = [super init] ) { self.song = dict[@"dict"]; self.singer = dict[@"singer"]; } return self; } + (instancetype)modelWithDictionary:(NSDictionary*) dict { return [[self alloc] initWithDictionary:dict]; }
4)在持有模型对象的类中添加属性,往往是数组
@interface AMMusicListModel : NSObject @property (nonatomic) NSMutableArray * musicArray; @end
并在适合的位置,创建该数组:
NSString *path = @".../music.plist"; NSArray * plistArray = [NSArray arrayWithContentsOfFile:path]; self->_musicArray = [NSMutableArray array]; for ( NSDictionary * dict in plistArray) { AMMusicModel * model = [AMMusictModel modelWithDictionary:dict); [self->_musicArray addObject:model]; }
懒加载
是一种延迟加载方式,在需要的时候才加载
是一种内存调优的手段,能够在一定程度上减少不必要内存的使用
具体做法:重写属性的getter方法
- (NSMutableArray*) musicArray { if ( _musicArray == nil ) { NSString *path = @".../music.plist"; NSArray * plistArray = [NSArray arrayWithContentsOfFile:path]; self->_musicArray = [NSMutableArray array]; for ( NSDictionary * dict in plistArray) { AMMusicModel * model = [AMMusictModel modelWithDictionary:dict); [self->_musicArray addObject:model]; } } return _musicArray; }
KVC
Key Value Coding,键值编码协议NSKeyValueCoding,提供一种机制来间接访问对象的属性。
获得值:
- (id)valueForKey:(NSString *)key
设置值:
- (void)setValue:(id)value forKey:(NSString *)key
路径访问方式:
存在复合关系时,通过 . 将属性名连接成路径访问
如下图,对象employee1中 包含属性manager ,而manager中包含其他属性
可以通过路径字符串 @”manager.employee1”访问
- (id)valueForKeyPath:(NSString *)keyPath - (void)setValue:(id)value forKeyPath:(NSString *)keyPath
意义:
1)提供了对象属性的另一种有效的访问方式
2)为KVO提供了实现基础
...
模型转字典
模型对象使用NSKeyValueCoding协议中的方法进行转换
- (NSDictionary<NSString *,id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。