码迷,mamicode.com
首页 > 其他好文 > 详细

Foundation框架(5)字典转模型

时间:2016-02-28 17:03:07      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:objective-c   ios   xcode   对象      面向对象   

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

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

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


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

     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


本文出自 “teacherAn” 博客,请务必保留此出处http://annmeng.blog.51cto.com/3321237/1745744

Foundation框架(5)字典转模型

标签:objective-c   ios   xcode   对象      面向对象   

原文地址:http://annmeng.blog.51cto.com/3321237/1745744

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!