编码篇-数据管理者Model

前言

      Model是数据管理者和持有者,是数据解析层剥离ViewConyroller的关键所在。同是也是cell滑动不卡(省去每次解析)的好方式。


为什么使用Model

1)当录入一些数据的时候,由于Cell的重复利用,那些录好的数据可能就丢失了,此时需要Model来记录数据和Cell的赋纸操作。

(2)当需要记录Cell的一些操作时,比如,点击过的Cell 标题字体变灰色,没有点击过的 Cell 标题字体颜色是黑色的。此时就需要 Model来记录 Cell的点击状态了。

(3)解析数据的作用,把数据解析的逻辑剥离出来,并且达到一次解析,多处使用的效果。

Model与字典的赋值

PersonModel *test=[[PersonModel alloc]init];           test.name=dic[@"name"];         test.sex=dic[@"sex"];         test.age=dic[@"age"]; 但是一旦数据多了起来,却会非常繁琐

字典的快速赋值 setValuesForKeysWithDictionary

我们来看一下  这个方法的说明

/* Given a dictionary containing keyed attribute values, to-one-related objects, and/or collections of to-many-related objects, set the keyed values. Dictionary entries whose values are NSNull result in -setValue:nil forKey:key messages being sent to the receiver. */ - (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;

意思是这个方法会从dic 中按 key 取值赋值给 对应的或相关的 本类中的  属性(通过  索引本类中的  set 方法实现)。

   有几点需要注意的地方:

1.后端JSON数据的每个字段和前端定义的model中的每个字段命名一致

     setValuesForKeysWithDictionary就可以帮助我们一一对应的把model的每个字段赋好值。

2.后端JSON数据中有  ,model没有对应的属性,崩溃。。。。。

解决办法实现- (void)setValue:(nullableid)value forUndefinedKey:(NSString*)key;并不需要在方法中写任何内容。

    3.后端JSON数据中没有  ,model有对应的属性,打印这个属性时是空的。

4.如果dic中的key与model中的变量名字不同,应该怎么赋值。

它可以让我们把命名不一致的字段手动赋值

-(void)setValue:(id)value    forUndefinedKey:(NSString*)key {if([key isEqualToString:@"id"])              {self.age=value;        } if([key isEqualToString:@"username"])            {self.name=value;          }   }

如何根据返回的 Json数据创建 Model 类

首先需要注意的一点是,判断返回的数据是不是 Json类型的,只需要注意一点即可:只要数据中只有  ""  , : {} []    这五种符号的就是 JSon,如果出现 =  ; 这样的符号就不是  Json数据了。

下面举个例子看下如何根据返回的 Json数据创建 Model 类;

你可以根据插件自动生成哪些个属性,但是一般插件生成的文件中 .m里面的内容并不友好,有时候会有错误

这里书写 Model属性有些技巧:

【1】我们先把最外层的结构找出来,折叠起内层的结构

【2】逐层展开,有需要就设置一个新的对象

【3】层层展开,外层对象包含调用内层对象即可。

.m中无须设置什么,如果怕有未知的 key 造成解析崩溃的话,可以在 .m中的每个类中实现 - (void)setValue:(nullableid)value forUndefinedKey:(NSString*)key;并不需要在方法中写任何内容。

最后使用的时候,像下面这样设置即可完成 Model的赋值,之后就可以使用了。


小结

数据管理者Model是MVC的基础,也是编程的规范所在。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逆向技术

16位汇编语言第二讲系统调用原理,以及各个寄存器详解

   16位汇编语言第二讲系统调用原理,以及各个寄存器详解 昨天已将简单的写了一下汇编代码,并且执行了第一个显示到屏幕的helloworld 问题?   hel...

24800
来自专栏Golang语言社区

go语言实现http服务端与客户端

go语言的net/http包的使用非常的简单优雅 (1)服务端 package main import ( "flag" "fm...

36960
来自专栏腾讯云Elasticsearch Service

Elasitcsearch 底层系列 Lucene 内核解析之 Stored Fields

Lucene 的 stored fields 主要用于行存文档需要保存的字段内容,每个文档的所有 stored fields 保存在一起,在查询请求需要返回字段...

24310
来自专栏阮一峰的网络日志

Node 定时器详解

JavaScript 是单线程运行,异步操作特别重要。 只要用到引擎之外的功能,就需要跟外部交互,从而形成异步操作。由于异步操作实在太多,JavaScript ...

36350
来自专栏Elasticsearch实验室

Elasitcsearch 底层系列 Lucene 内核解析之 Stored Fields

Lucene 的 stored fields 主要用于行存文档需要保存的字段内容,每个文档的所有 stored fields 保存在一起,在查询请求需要返回字段...

84650
来自专栏博客园

Asp.Net Web API(四)

    如果Web API控制器抛出一个未捕捉的异常,会发生什么呢?在默认情况下,大多数异常都会转换为一个带有状态码500的内部服务器错误的HTTP响应。

21720
来自专栏后端云

支持windows虚拟机和linux虚拟机分区调度

用该image生成的vm,没有被nova-scheduler调度到windows主机组。

13040
来自专栏FD的专栏

一步步理解python的异步IO

看到越来越多的大佬都在使用python的异步IO,协程等概念来实现高效的IO处理过程,可是我对这些概念还不太懂,就学习了一下。 因为是初学者,在理解上有很多不到...

18920
来自专栏Java技术栈

Java程序员注意:Tomcat Get请求的巨坑!

4.1K20
来自专栏文武兼修ing——机器学习与IC设计

队列及其实现队列队列的实现

队列 队列即FIFO,一言以蔽之就是先进先出。比如入队列的顺序是1,2,3,4,那么出队列的顺序也是1,2,3,4 队列的实现 软件——GO语言实现 除了使用链...

43970

扫码关注云+社区

领取腾讯云代金券