如果有以上结构的plist文件,那么应该怎么将其中的字典转换成模型?

显然一个模型已经无法搞定了,此时需要用到双数据模型(字典转模型)。

我写了两种方式来实现模型的转换:

方法一

第一个模型:CarModel

两个属性:

@property (nonatomic,copy)NSArray *cars;

@property (nonatomic,copy)NSString *title;


第二个模型:InnerCarModel

三个属性:

@property (nonatomic,copy)NSString *icon;

@property (nonatomic,copy)NSString *name;

@property (nonatomic,strong)CarModel *carModel;

首先看carDateModel.h

#import <UIKit/UIKit.h>

@interface CarModel : UIView

@property (nonatomic,copy) NSArray *cars;
@property (nonatomic,copy) NSString *title; -(instancetype)initWithCarDict:(NSDictionary*)dict;
+(instancetype)carModel:(NSDictionary*)dict;
@end

这个carDateModel中有两个属性

为什么要提供类方法和对象方法?

在controller的数据加载中;

@property(nonatomic, stong)NsmutableArray*arrayDate;

在使用该数组时,我们是这样赋值的 eg: xxxx = self.arrayDate[i]

这种方式赋值会调用arrayDate 的getter方法,所以我们需要重写arrayDate的getter方法;

#import "ViewController.h"
#import "InnerCarModel.h"
#import "CarModel.h"
@interface ViewController () <UITableViewDataSource,UITableViewDelegate> @property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (nonatomic,strong) NSMutableArray *arrayDate;
@property (nonatomic,strong) NSMutableArray *indexDate; @end @implementation ViewController -(NSMutableArray *)arrayDate{ if (nil == _arrayDate) {
_arrayDate = [NSMutableArray array];
// _indexDate = [NSMutableArray array];
NSString *path = [[NSBundle mainBundle] pathForResource:@"cars_total.plist" ofType:nil];
NSArray *tempArray = [[NSArray alloc] initWithContentsOfFile:path]; for (NSDictionary *dict in tempArray) {
CarModel *model = [[CarModel alloc] initWithCarDict:dict]; //here do something innercarmodel at carModel.m
InnerCarModel *innerCarModel = [[InnerCarModel alloc] init];
innerCarModel.carModel = model; [_arrayDate addObject:model];
}
// 使用的kvc 找到数组中对应的属性, 返回一个数组
// 写到这个地方, 只加载一次
_indexDate = [_arrayDate valueForKeyPath:@"title"];
}
return _arrayDate;
}

我们需要明白这三句的意义:

1. CarDateModel *carDateModel = [[CarDateModelalloc]
initWithCarDict:dict]

此句使用了我们在carDateModel.h中为外界提供的方法将数据放到carDateModel中;

2.InnerCarModel *innerModel = [[InnerCarModel alloc] init];

此句我们实例化了一个innerModel,

InnerCarModel怎么定义的?

#import
<UIKit/UIKit.h>

@class
CarModel;

@interface InnerCarModel :
UIView

@property (nonatomic,copy)NSString *icon;

@property (nonatomic,copy)NSString *name;

@property (nonatomic,strong)CarModel *carModel;

@end

是的,没错,在InnerCarModel Model中包含了一个carModel属性;

3.  InnerModel.carDatemodel =carDateModel;

“=”右侧:carDateModel就是数据,数据中国包含了cars 和 title,在此我们需要的书cars。

“=”左侧InnerModel.carDatemodel,该句则是调用了carModel的setter方法。

所以我们需要重写carModel的setter方便我们对InnerCarModel的属性icon和name赋值

#import "InnerCarModel.h"
#import "CarModel.h" @implementation InnerCarModel -(void)setCarModel:(CarModel *)carModel { _carModel = carModel; NSMutableArray *mutbleArray = [NSMutableArray array];
for (NSDictionary *dict in carModel.cars) { InnerCarModel *innerModel = [[InnerCarModel alloc] initWithInnerCarDict:dict];
[mutbleArray addObject:innerModel];
}
_carModel.cars = mutbleArray;
} -(instancetype)initWithInnerCarDict:(NSDictionary*)dict{ if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
} +(instancetype)innerCarModel:(NSDictionary*)dict{
return [[self alloc]initWithInnerCarDict:dict];
} @end

initWithInnerCarDict  innerCarModel
这两个方法是私有的,不必在.h中声明。
以上,我们就完成了双模型的转换。
方法二
第一个模型     
两个属性: 
  @property (nonatomic,copy) NSArray *cars;
  @property (nonatomic,copy) NSString *title;
第二个模型:
 两个属性:@property(nonatomic,copy) NSString *icon;
         @property (nonatomic,copy) NSString *name;
不同之处:
加载数据的方式
</pre><pre name="code" class="objc">-(NSMutableArray *)arrayDate{

    if (nil == _arrayDate) {
_arrayDate = [NSMutableArray array];
// _indexDate = [NSMutableArray array];
NSString *path = [[NSBundle mainBundle] pathForResource:@"cars_total.plist" ofType:nil];
NSArray *tempArray = [[NSArray alloc] initWithContentsOfFile:path]; for (NSDictionary *dict in tempArray) {
CarModel *model = [[CarModel alloc] initWithCarDict:dict]; [_arrayDate addObject:model];
}
_indexDate = [_arrayDate valueForKeyPath:@"title"];
}
return _arrayDate;
}

关键句1 CarModel *model = [[CarModel alloc] initWithCarDict:dict];
进入initWithCarDict:方法
</pre><pre name="code" class="objc">-(instancetype)initWithCarDict:(NSDictionary*)dict{</span></span>
    if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict]; NSMutableArray *mutbleArray = [NSMutableArray array];
for (NSDictionary *dict in self.cars) { InnerCarModel *innerModel = [[InnerCarModel alloc] initWithInnerCarDict:dict];
[mutbleArray addObject:innerModel];
}
self.cars = mutbleArray; }
return self;
}



此时,此中方式是,直接调用了initWithInnerCarDict方法,加载了self.cars 和title为 CarModel,

再将的self.cars数据转化为 InnerCarModel ,再返回数据到CarModel *model ,

_arrayDate最终装载的就是转化好的数据,供我们去调用。
总之,字典转模型,重点要关注数据的存和取的过程,在这个过程中不能将:  xxxx = self.arrayDate[i]
这么一句话简单的理解为赋值语句,你要想到这句话中,包含的getter方法,在这个getter方法中,可能包含着setter 方法;
我们费了这么劲儿去转模型,就是为了:
1)降低代码的耦合度
2)所有字典转模型部分的代码统一集中在一处处理,降低代码出错的几率
3)在程序中直接使用模型的属性操作,提高编码效率 
4)调用方不用关心模型内部的任何处理细节

需要根据外部的需求,提供相应的接口方法。

以上程序用UItableView实现了车品牌的展示,并建立相关的索引

程序源码在:

方法1:http://download.csdn.net/detail/yang198907/9222089

方法2: http://download.csdn.net/detail/yang198907/9222091

iOS-字典转双模型的实现过程中需要关注的细节的更多相关文章

  1. iOS 字典自动生成模型

    在实际开发中,我们经常需要根据字典来建模型.每次都打那么一串代码,想想也是挺恶心的.可以自己给NSDictionary写一个分类,进行属性生成. NSDictionary+Property.h #im ...

  2. iOS:使用block代码块实现事件处理过程中的回调

    block是什么,这里就不多加强调了,它的优点: 第一:执行效率高,速度快 第二:使用起来比代理简单,省却不少代码,增强代码美感 有一些小的知识点要强调一下: 第一点:它类似于一个匿名函数,也跟jav ...

  3. Web CI过程中的Security解决方案

    http://www.infoq.com/cn/articles/WebScan-CI 一. 当前Web应用安全现状 随着中国互联网金融的爆发和繁荣,Web应用在其中扮演的地位也越来越重要,比如Web ...

  4. IOS中将字典转成模型对象

    作为IOS开发初级者今天学习了 如何将plist数据字典转成 数据对象数组中 .有点像C#中解析xml数据 的过程. apps.plist的xml数据是这样的 <?xml version=&qu ...

  5. IOS 字典快速转换为Model 模型

    一般情况下IOS得局部页面加载的过程是,创建一个Model然后,将Nib文件与Model进行关联,然后能够快速的获取到Nib文件上的控件实例.操作生成页面. 但是原生的内容是没有直接通过Json获取M ...

  6. IOS 字典模型互转框架 MJExtension

    IOS 字典模型互转框架 MJExtension   能做什么? MJExtension是一套字典和模型之间互相转换的超轻量级框架 MJExtension能完成的功能 字典(JSON) -->  ...

  7. iOS字典转模型MJExtension使用

    如果项目是纯OC的建议使用,MJExtension是一套字典和模型之间互相转换的超轻量级框架,可以轻松完成: 字典(JSON) --> 模型(Model) 模型(Model) --> 字典 ...

  8. iOS 字典或者数组和JSON串的转换

    在和服务器交互过程中,会iOS 字典或者数组和JSON串的转换,具体互换如下: // 将字典或者数组转化为JSON串 + (NSData *)toJSONData:(id)theData { NSEr ...

  9. OSI七层协议模型及OSI参考模型中的数据封装过程

    转载自:http://blog.csdn.net/qq_14935437/article/details/71081546 OSI模型,即开放式通信系统互联参考模型(Open System Inter ...

随机推荐

  1. 反射,获取类的属性以及get方法

    vo实体类: public class Result { /*** * 返回结果code * ok:10000 * error:20000 */ private String code; /*** * ...

  2. DIV+CSS布局的优势和弊端

    DIV+CSS的优势1.符合W3C标准.这保证您的网站不会因为将来网络应用的升级而被淘汰.2.对浏览者和浏览器更具亲和力.由于CSS富含丰富的样式,使页面更加灵活性,它可以根据不同的浏览器,而达到显示 ...

  3. 【雕爷学编程】Arduino动手做(42)---PM2.5粉尘传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

  4. javascript 获取页面的高度及滚动条的位置的代码

    http://www.jb51.net/article/23331.htm javascript 获取页面的高度及滚动条的位置的代码 作者: 字体:[增加 减小] 类型:转载   javascript ...

  5. Redis 消息中间件 ServiceStack.Redis 轻量级

    问题: 公司开了个新项目,算上我一共3个人.车间里机台通过流水线连通联动的玩意.一个管理控制系统连接各个机台和硬件.专机类型就有5种,个数差不多20个左右. 软件规划的时候采用总分的结构,管理控制系统 ...

  6. 【scrapy运行姿势】scrapy.cmdline.execute

    scrapy.cmdline.execute scrapy的cmdline命令 1.启动爬虫的命令为:scrapy crawl (爬虫名) 2.还可以通过以下方式来启动爬虫 方法一:创建一个.py文件 ...

  7. Java-建立一个AnalysisResult类,对成绩进行分析

    import java.io.*; import java.util.*; public class AnalysisResult { public static void main(String[] ...

  8. [wordpress使用]001_环境安装

    Wordpress强大的可扩展性和易用性等功能,使得越来越多的人选择它来建立自己的博客和网站.那么新手朋友该如何入手呢,今天制作这个教程就是旨在帮助新手朋友快速入门,从而为今后WP建站打下坚实的基础. ...

  9. [Python基础]006.IO操作

    IO操作 输入输出 print raw_input input 文件 打开文件 关闭文件 读文件 写文件 文件指针 实例 输入输出 输入输出方法都是Python的内建函数,并且不需要导入任何的包就可以 ...

  10. Mysql基础(二)

    多表连接 #多表查询 /* sql99标准 等值连接 ①多表等值连接的结果为多表的交集部分 ② n个连接至少需要 n-1个连接 ③一般需要为表起别名 ④可以搭配前面介绍的所有子句的使用,比如排序,分组 ...