iOS-字典转双模型的实现过程中需要关注的细节
如果有以上结构的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-字典转双模型的实现过程中需要关注的细节的更多相关文章
- iOS 字典自动生成模型
在实际开发中,我们经常需要根据字典来建模型.每次都打那么一串代码,想想也是挺恶心的.可以自己给NSDictionary写一个分类,进行属性生成. NSDictionary+Property.h #im ...
- iOS:使用block代码块实现事件处理过程中的回调
block是什么,这里就不多加强调了,它的优点: 第一:执行效率高,速度快 第二:使用起来比代理简单,省却不少代码,增强代码美感 有一些小的知识点要强调一下: 第一点:它类似于一个匿名函数,也跟jav ...
- Web CI过程中的Security解决方案
http://www.infoq.com/cn/articles/WebScan-CI 一. 当前Web应用安全现状 随着中国互联网金融的爆发和繁荣,Web应用在其中扮演的地位也越来越重要,比如Web ...
- IOS中将字典转成模型对象
作为IOS开发初级者今天学习了 如何将plist数据字典转成 数据对象数组中 .有点像C#中解析xml数据 的过程. apps.plist的xml数据是这样的 <?xml version=&qu ...
- IOS 字典快速转换为Model 模型
一般情况下IOS得局部页面加载的过程是,创建一个Model然后,将Nib文件与Model进行关联,然后能够快速的获取到Nib文件上的控件实例.操作生成页面. 但是原生的内容是没有直接通过Json获取M ...
- IOS 字典模型互转框架 MJExtension
IOS 字典模型互转框架 MJExtension 能做什么? MJExtension是一套字典和模型之间互相转换的超轻量级框架 MJExtension能完成的功能 字典(JSON) --> ...
- iOS字典转模型MJExtension使用
如果项目是纯OC的建议使用,MJExtension是一套字典和模型之间互相转换的超轻量级框架,可以轻松完成: 字典(JSON) --> 模型(Model) 模型(Model) --> 字典 ...
- iOS 字典或者数组和JSON串的转换
在和服务器交互过程中,会iOS 字典或者数组和JSON串的转换,具体互换如下: // 将字典或者数组转化为JSON串 + (NSData *)toJSONData:(id)theData { NSEr ...
- OSI七层协议模型及OSI参考模型中的数据封装过程
转载自:http://blog.csdn.net/qq_14935437/article/details/71081546 OSI模型,即开放式通信系统互联参考模型(Open System Inter ...
随机推荐
- ThinkPHP6.0 容器和依赖注入
ThinkPHP6.0 容器和依赖注入 分为如下两部分: 依赖注入 容器 依赖注入 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入: 在控制器架构方法和操作和方法中一旦对参数进行对象类型约束则 ...
- SecureCRT VBscript连接指定端口和波特率
crt.Session.Connect "/Serial COM2 /BAUD 38400" 其它可用选项参考: crt.session.connect options https ...
- Alink漫谈(四) : 模型的来龙去脉
Alink漫谈(四) : 模型的来龙去脉 目录 Alink漫谈(四) : 模型的来龙去脉 0x00 摘要 0x01 模型 1.1 模型包含内容 1.2 Alink的模型文件 0x02 流程图 0x03 ...
- iOS [AFHTTPSessionManager GET:parameters:progress:success:failure:]: unrecognized selector sent to
AFN更新到4.0.1后,崩溃[AFHTTPSessionManager GET:parameters:progress:success:failure:]: unrecognized selecto ...
- hdu2665可持久化线段树,求区间第K大
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- POJ3225
题目链接:https://vjudge.net/problem/POJ-3225 解题思路:这道题要是不看题解以本渣新现在的实力确实是做不出来. 以区间为基础建立线段树. 当X=‘U', 将区间T内的 ...
- mysql 的大文本存储TEXT & BLOB
TEXT & BLOB 一般在保存少量字符串的时候,我们会选择 CHAR 或者 VARCHAR:而在保存较大文本时,通常会选择使用 TEXT 或者 BLOB,二者之间的主要差别是 BLOB 能 ...
- Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装
MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...
- [书籍分享]0-006.App营销解密:移动互联网时代的营销革命
封面 内容简介 如何在移动互联网上推广和销售自己的产品?如何通过移动互联网为顾客提供服务?如何在移动互联网上树立和传播自己的品牌?这几乎是当下所有互联网企业和传统企业都在思考的问题,企业要想在移动互联 ...
- 国际化之fmt标签
1. 什么是国际化和本地化: I. 本地化:一个软件在某个国家或地区使用时,采用该国家或地区的语言,数字,货币,日期等习惯.II. 国际化:软件开发时,让它能支持多个国家和地区的本地化应用.使得应用软 ...