应用场景:app请求后端数据,返回的数据是JSON形式,如:

  1. {
  2. "is_favor" = 0;
  3. "is_follow" = 0;
  4. "is_praise" = 0;
  5. "is_self" = 0;
  6. }

我经常new一个接受该组数据的class,然后用对象的setValuesForKeysWithDictionary方法对每个字段自动进行赋值。

  1. HSTopicModel *model = [HSTopicModel new];
  2. [model setValuesForKeysWithDictionary:responseJSON];

只要后端JSON数据的每个字段和前端定义的model中的每个字段命名一致,setValuesForKeysWithDictionary就可以帮助我们一一对应的把model的每个字段赋好值。如果有字段命名不一致的情况,我们可以在model的.m文件中实现一个方法,- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key; 它可以让我们把命名不一致的字段手动赋值。

  1. - (void)setValue:(id)value forUndefinedKey:(NSString *)key {
  2. if (key) {
  3. if([key isEqualToString:@"id"]) {
  4. _uid = [self numberToString:value];
  5. } else if ([key isEqualToString:@"is_follow"]) {
  6. _isFollow = (1 == [self numberToInt:value]) ? YES : NO;
  7. } else if ([key isEqualToString:@"is_editer"]) {
  8. _isEditer = (1 == [self numberToInt:value]) ? YES : NO;
  9. } else if ([key isEqualToString:@"constelltion"]) {
  10. _constellation = [self numberToString:value];
  11. } else if ([key isEqualToString:@"status"]) {
  12. _isBlocked = (1 == [self numberToInt:value]) ? YES : NO;
  13. } else if ([key isEqualToString:@"nospeak"]) {
  14. _isBanned = (1 == [self numberToInt:value]) ? YES : NO;
  15. }
  16. }
  17. }

另外还有一个方法,与这个方法功能相反 - (void)setValue:(nullable id)value forKey:(NSString *)key; 这是让我们手动给命名一致的字段赋值的方法,这两个方法如果同时实现,那么只会运行- (void)setValue:(nullable id)value forKey:(NSString *)key; 这个方法。

这种方式用了很久,不过最近出现了一次灵异现象。后端数据的字段名为"nospeak",前端定义的为"isNoSpeak",在模拟器iPhone6(9.0)上运行正常,但是到了模拟器iPhone5s(9.0)上一跑到给这个字段赋值时就crash,百思不得姐,于是将字段名随便更换了一个,结果crash现象消失了,再换回"isNoSpeak",又开始crash。最终没有找到问题的根因,并且消耗了很多时间定位问题。

之后,我决定换一种赋值的方法,即在model的.m文件中实现

- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *,id> *)keyedValues; 方法。虽然这个方法需要对每个字段手动赋值,但是可以方便我们对每个字段进行类型判断等校验,一旦出现问题,可以很快定位。

  1. - (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *,id> *)keyedValues
  2. {
  3. if (keyedValues) {
  4. for (NSString *key in [keyedValues keyEnumerator]) {
  5. if([key isEqualToString:@"id"]) {
  6. _tid = [self numberToString:[keyedValues objectForKey:key]];
  7. } else if ([key isEqualToString:@"score"]) {
  8. _score = [self numberToString:[keyedValues objectForKey:key]];
  9. } else if ([key isEqualToString:@"title"]) {
  10. _title = [self numberToString:[keyedValues objectForKey:key]];
  11. }
  12. }
  13. }
  14. }

原文:http://blog.csdn.net/worldzhy/article/details/49982179#

转载 --ios 模型-setValuesForKeysWithDictionary的更多相关文章

  1. 又一个高性能轻量级的iOS模型框架YYModel

    前言 iOS的模型框架其实有很多了,去年研究过Mantle,也了解过JSONModel.MJExtension,最近的项目项目优化的时候,再次考虑,基于轻量级.高性能的考虑,最终选择了YYModel. ...

  2. IOS: 模型面数控制

    你可以先试试 生成之后在虚拟机上运行一下就知道了 不过关键也看手机的好坏 場景 人物 面數的話越少越好(但要保持模型的完整)  貼圖解析度也不要太大 資料越少越好 //================ ...

  3. 转载iOS开发中常见的警告及错误

    iOS警告收录及科学快速的消除方法     前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作. ...

  4. [转载]iOS 10 UserNotifications 框架解析

    活久见的重构 - iOS 10 UserNotifications 框架解析 TL;DR iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  5. 字典转模型框架 Mantle的使用:国外程序员最常用的iOS模型

    Mantle简介 Mantle 是iOS和Mac平台下基于Objective-C编写的一个简单高效的模型层框架. Mantle能做什么 Mantle可以轻松把JSON数据.字典(Dictionary) ...

  6. [转载]iOS面试题总

    转载自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html (2014-06-13 20:23:33) 转载▼ 标签: 转载   crash 原文 ...

  7. 转载 -- iOS数据持久化存储

    作者:@翁呀伟呀 授权本站转载 概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方 ...

  8. [转载]iOS开发之手势识别

    感觉有必要把iOS开发中的手势识别做一个小小的总结.在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextVi ...

  9. 转载-iOS SDK开发

    最近帮兄弟公司的做支付业务sdk,积累了 sdk 封装的经验!下面我会从零开始把我的 sdk 封装和调试经历分享给大家,希望能给看到这篇文章的人有所帮助! 本文我会从以下几个方面来讲述: Framew ...

随机推荐

  1. C++ 全局变量、局部变量、静态全局变量、静态局部变量的区别

    全局变量.局部变量.静态全局变量.静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作 ...

  2. mongoDB数据库

    1.mongoDB简介:mongoDB 为非关系数据库,集合(collection)关系数据库中的表,中存储的为json结构的文档,集合中的每一条记录都可以结构不同, 但必须都有_id字段(mongo ...

  3. NOIP2008 传纸条

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  4. 15,SFDC 管理员篇 - 变更和部署

    Setup | Deploy | Sandbox 通过在Production上建立Dev .Test 两套环境来   Sandbox 有四种类型 Developer Sandbox & Dev ...

  5. Spring整合log4j

    log4j2.xml放在类加载路径下,类加载路径就是WEB-INF文件夹下的classses文件,因为运行时,src包里的java类会被编译成.class盘文件,放在WEB-INF文件夹下的class ...

  6. 对于有了ACM以后的生活

    我是大二学生,才接触ACM不到5个星期,因为受到我们班dalao的"引诱",去参加了一次我们学校举行的萌新杯,于是就入坑了,而我又在校外学习一些关于安全的知识,前几天一直纠结要不要 ...

  7. MySQL5.6安装步骤

    MySQL5.6安装步骤(windows7/8_64位) 1. 下载MySQL Community Server 5.6.11 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下 ...

  8. 转换,2D,3D

    一,转换定义: 1,能够改变元素的形状,尺寸,位置 2,转换分两种: 2D转换:只能在X,Y轴发生改变: 例子:旋转(rotate).拉伸(scale).平移(move).倾斜(skew) 3D转换: ...

  9. drawing

    /* 程序名:drawing..c 功能:展示OpenCV的图像绘制功能 */ #include "cv.h" #include "highgui.h" #in ...

  10. HTTP权威协议笔记-7.缓存

    7.1 冗余的数据传输 缓存的作用:当客户端每次访问服务器,服务器都会返回一份相同文件,一些相同的字节会不断的在网络内传输,这样冗余的数据传输会耗尽昂贵的带宽,降低传输速度,加重Web服务器的负载. ...