Model是数据管理者和持有者,是数据解析层剥离ViewConyroller的关键所在。同是也是cell滑动不卡(省去每次解析)的好方式。
(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类型的,只需要注意一点即可:只要数据中只有 "" , : {} [] 这五种符号的就是 JSon,如果出现 = ; 这样的符号就不是 Json数据了。
下面举个例子看下如何根据返回的 Json数据创建 Model 类;
你可以根据插件自动生成哪些个属性,但是一般插件生成的文件中 .m里面的内容并不友好,有时候会有错误
这里书写 Model属性有些技巧:
【1】我们先把最外层的结构找出来,折叠起内层的结构
【2】逐层展开,有需要就设置一个新的对象
【3】层层展开,外层对象包含调用内层对象即可。
.m中无须设置什么,如果怕有未知的 key 造成解析崩溃的话,可以在 .m中的每个类中实现 - (void)setValue:(nullableid)value forUndefinedKey:(NSString*)key;并不需要在方法中写任何内容。
最后使用的时候,像下面这样设置即可完成 Model的赋值,之后就可以使用了。
数据管理者Model是MVC的基础,也是编程的规范所在。