iOS模型设计---字典转模型






iOS模型设计


iOS开发中,模型一词几乎伴随着每个程序员的开发生涯。在接触模型之前,小编在开发中也会经常碰到逻辑混乱、条理不清晰等情况。接下来,小编将会带领大家学习MVC架构中重要的一环---数据模型的建立。

开始之前,我们以一个例子来进行阐述。小编在上一篇文章的(iOS UI设计九宫格布局)结尾留下了一个九宫格的UI设计界面,如图。


    整个布局中,每个按钮模块所需的图标、名称均来自数据文件(此处为plist文件)。接下来,我们来了解一下如何将该数据封装成模型,避免直接从ViewController中读取,造成ViewControler.m文件冗杂。


1条件准备 


  在开始讲解之前,我们需要准备一下环境,基本的素材、文件都需要搭建完毕,相关的源代码可以直接向小编获取哦!


1.1 相关素材



1.2 plist文件

我们先看一下plist文件中的内容,如下图。它是将图标和功能进行对应的关键文件。可以直接通过键值获取相应的文件名。


1.3 布局文件

本文重点在于模型的封装,不在于界面的布局,相关布局可以参照《iOS UI设计九宫格布局》。默认代码已经布局完成。



2数据引用  


2.1 plist文件加载

上图中,我们可以看到,plist文件其实是一个数组,数组每个元素为字典。所以我们在ViewController.m文件中定义一个_plist属性,然后我们使用[NSArray arrayWithContentsOfFiles]方法来初始化_plist。采取懒加载的形式,代码如下:

@property(nonatomic,strong)NSArray *plist;

- (NSArray*)plist

{

        if(_plist == nil)

{

        NSString path = [NSBundlemainBundle]pathOfResource:@”appinfo.plist” ofType:@”nil”;

        _plist=[ NSArrayarrayWithContentsOfFiles:path];

}

return _plist;

}

2.2 素材引用

plist文件加载后,成员变量_plist中存储的是字典,可以根据字典的属性将对应的值取出来。如下所示。


2.3 缺点分析

1)目前,成员变量_plist中直接存储的是字典。所有的数据都在ViewController.m中处理,容易引起该文件冗余。

2)在字典的读取中,如果属性名称错误,会引起报错,且错误位置太多,不方便排查。

3)上例中,字典只有两个属性。如果有多个键值,手动赋值工作量很大,出错的概率也比较高。



3模型封装  


3.1 模型的建立

模型建立的思路:目前成员变量_plist中直接存放的是字典,每次加载字典都需要更改ViewController文件。我们需要做的是,让成员变量_plist中存放一个数据模型,plist文件的加载在数据模型中进行,让控制器不再直接操作数据的加载。

(1)      数据模型

新建一个类:AppInfo。在头文件中,声明字典中的两个属性。相关代码如下:

(2)     数据引用

  接下来,我们要让成员变量_plist中存储的是上述AppInfo模型,而不再是字典。所以,ViewController.m文件中的成员变量_plistgetter方法懒加载形式更改为如下:


_plist变量更改为存储模型后,获取数据不再使用字典的键名,而是通过模型的getter方法来获取plist文件中的具体数据。


3.2 instancetype和id的区别

到目前为止,模型已经建立起来。但细心的读者能够发现,虽然将成员变量中保存的是字典,但是代码量看起来增加了不少,仍然感觉比较混乱,数据模型仍然没有完全分开。再进行优化之前,我们先来看一个知识点。

iOS7之后,Apple大力推荐我们使用一种数据类型instancetype。这种数据类型类似于id ,属于万能指针。但他们仍然有区别。区别主要体现在,类方法中,instancetype能够动态的区分当前对象的数据类型,进行编译检测,而id就不行。

注意:

  instancetype只能用于返回值,不能作为参数

  id类型在对象方法中,也是可以动态检测对象类型的

  ③后续开发中,不管是对象方法还是类方法,初始化方法尽可能都是用instancetype指针。



3.3 模型的优化

接下来,我们进入重要的环节模型的优化。模型的优化,主要分为以下几部分:

     字典的初始化放入模型文件中

     类方法比对象方法效率更高

     采取KVC编码,批量进行字典赋值

     将代码放在该出现的位置

3.3.1 字典初始化

在成员变量_plistgetter方法中,定义了一个模型对象appInfo,然后对其进行赋值。实际上,我们在实际开发过程中,为了将有关数据操作方面的分离出来,此处的赋值操作可以直接放入模型中处理,优化后的代码如下:

     AppInfo.h文件中声明初始化方法


     AppInfo.m文件中实例化该方法


     ViewController.m文件中引用数据


3.3.2 更改类方法

上一小结中,我们在类中定义了初始化对象方法。但在实际的开发中,富有经验的程序员经常会提供类方法进行初始化操作。对象方法和类方法同时存在,也是程序员专业性的一种体现。更重要的是:类方法效率更高。

     AppInfo.h文件中定义类方法


    AppInfo.m文件中实例化类方法


    ViewController.m文件中调用


3.3.3 KVC(键值编码)的使用

KVC(Key-ValueCoding),名为“键值编码”。本例中,对于字典的赋值是采取的手动按照属性值进行一一对应的,如果属性太多,工作量非常大。另外,也非常容易出错。使用setValuesForKeysWithDictionary来进行自动赋值。注意,字典的键名必须与模型的成员变量名一致。修改AppInfo.m文件中的初始化方法。


3.3.4 将代码放在该出现的位置

1plist文件的加载位置

plist作为数据文件,理应出现在模型中。所以我们在模型中提供一个类方法,用来加载plist文件。当ViewController.m文件需要plist文件时,直接找模型文件加载处理就好。

   AppInfo.h文件


   AppInfo.m文件


   ViewController.m文件



(2)UIImage也封装到模型中

  前面的代码中,我们是从模型中获取到了图片的名称,然后在ViewController.m文件中利用UIImageimageNamed方法通过图片名获取图片。但是,在实际中,我们仍然可以将image也封装到模型中,只需要在ViewController.m文件中通过模型来获取即可。

     AppInfo.h文件


②  AppInfo.m文件

     ViewController.m文件




到这里,我们的模型封装基本已经完成。模型的主要思路就是把与数据相关的代码剥离到模型文件中,尽可能的让ViewController不再管理数据的存取操作等,当Controller需要数据的时候只需要调用模型文件获取即可。





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值