转载 --ios 模型-setValuesForKeysWithDictionary
应用场景:app请求后端数据,返回的数据是JSON形式,如:
- {
- "is_favor" = 0;
- "is_follow" = 0;
- "is_praise" = 0;
- "is_self" = 0;
- }
我经常new一个接受该组数据的class,然后用对象的setValuesForKeysWithDictionary方法对每个字段自动进行赋值。
- HSTopicModel *model = [HSTopicModel new];
- [model setValuesForKeysWithDictionary:responseJSON];
只要后端JSON数据的每个字段和前端定义的model中的每个字段命名一致,setValuesForKeysWithDictionary就可以帮助我们一一对应的把model的每个字段赋好值。如果有字段命名不一致的情况,我们可以在model的.m文件中实现一个方法,- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key; 它可以让我们把命名不一致的字段手动赋值。
- - (void)setValue:(id)value forUndefinedKey:(NSString *)key {
- if (key) {
- if([key isEqualToString:@"id"]) {
- _uid = [self numberToString:value];
- } else if ([key isEqualToString:@"is_follow"]) {
- _isFollow = (1 == [self numberToInt:value]) ? YES : NO;
- } else if ([key isEqualToString:@"is_editer"]) {
- _isEditer = (1 == [self numberToInt:value]) ? YES : NO;
- } else if ([key isEqualToString:@"constelltion"]) {
- _constellation = [self numberToString:value];
- } else if ([key isEqualToString:@"status"]) {
- _isBlocked = (1 == [self numberToInt:value]) ? YES : NO;
- } else if ([key isEqualToString:@"nospeak"]) {
- _isBanned = (1 == [self numberToInt:value]) ? YES : NO;
- }
- }
- }
另外还有一个方法,与这个方法功能相反 - (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; 方法。虽然这个方法需要对每个字段手动赋值,但是可以方便我们对每个字段进行类型判断等校验,一旦出现问题,可以很快定位。
- - (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *,id> *)keyedValues
- {
- if (keyedValues) {
- for (NSString *key in [keyedValues keyEnumerator]) {
- if([key isEqualToString:@"id"]) {
- _tid = [self numberToString:[keyedValues objectForKey:key]];
- } else if ([key isEqualToString:@"score"]) {
- _score = [self numberToString:[keyedValues objectForKey:key]];
- } else if ([key isEqualToString:@"title"]) {
- _title = [self numberToString:[keyedValues objectForKey:key]];
- }
- }
- }
- }
原文:http://blog.csdn.net/worldzhy/article/details/49982179#
转载 --ios 模型-setValuesForKeysWithDictionary的更多相关文章
- 又一个高性能轻量级的iOS模型框架YYModel
前言 iOS的模型框架其实有很多了,去年研究过Mantle,也了解过JSONModel.MJExtension,最近的项目项目优化的时候,再次考虑,基于轻量级.高性能的考虑,最终选择了YYModel. ...
- IOS: 模型面数控制
你可以先试试 生成之后在虚拟机上运行一下就知道了 不过关键也看手机的好坏 場景 人物 面數的話越少越好(但要保持模型的完整) 貼圖解析度也不要太大 資料越少越好 //================ ...
- 转载iOS开发中常见的警告及错误
iOS警告收录及科学快速的消除方法 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作. ...
- [转载]iOS 10 UserNotifications 框架解析
活久见的重构 - iOS 10 UserNotifications 框架解析 TL;DR iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...
- 字典转模型框架 Mantle的使用:国外程序员最常用的iOS模型
Mantle简介 Mantle 是iOS和Mac平台下基于Objective-C编写的一个简单高效的模型层框架. Mantle能做什么 Mantle可以轻松把JSON数据.字典(Dictionary) ...
- [转载]iOS面试题总
转载自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html (2014-06-13 20:23:33) 转载▼ 标签: 转载 crash 原文 ...
- 转载 -- iOS数据持久化存储
作者:@翁呀伟呀 授权本站转载 概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方 ...
- [转载]iOS开发之手势识别
感觉有必要把iOS开发中的手势识别做一个小小的总结.在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextVi ...
- 转载-iOS SDK开发
最近帮兄弟公司的做支付业务sdk,积累了 sdk 封装的经验!下面我会从零开始把我的 sdk 封装和调试经历分享给大家,希望能给看到这篇文章的人有所帮助! 本文我会从以下几个方面来讲述: Framew ...
随机推荐
- 如何生成JavaAPI doc
1 准备工作 1.1 填写完整的注释 对需要生成API的类,填写完整的注释,包括类注释,方法注释,具体格式如下: 类注释: 原先可能author是作者,需要修改成author英文 ...
- 修改BIND9实现TCP DNS
近日适逢某平方节日,Google国外网站陆续出现被墙的状况,想必大家都是知道的. 其实本人一直在使用SSH的Socket代理功能爬梯子,效果还是不错的,加上学校有原生IPv6支持,就算不走代理一般也能 ...
- Ubuntu Kylin 14.04-修改IP固定地址
前言:今天我们办公室的网络不稳定,隔一会时间就断掉,后来请负责网络的同事来处理了一下,说是路由器的有些配置起冲突了,所以他将IP地址做了一些修改,比如:原IP是192.168.0.110 ...
- 2016/9/25编写java实验报告时对synchronized(同步代码块)的一些感悟
通过此次实验,明白了多线程的设置和启动.synchronized代码块的用法.线程的优先级使用方法.知道了那几类资源是线程共享的. 我现在理解的多线程是:实例化一个继承了Thread类或实现了Runn ...
- 基于Metronic的Bootstrap开发框架总览
基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理 最近一直很多事情,博客停下来好久没写了,整理下思路,把最近研究的基于Metronic的Bootstrap开发框 ...
- 使用 Wireshark 调试 HTTP/2 流量
https://imququ.com/post/http2-traffic-in-wireshark.html
- centos下ssh无密码验证
#安装openssh-clients,rsync等#1.修改所有master和slave服务器的sshd_config,后面增加UseDNS noClientAliveInterval 30RSAAu ...
- Web后台技术趋势
今天使用Google Trend比较了一下服务器端的程序开发语言技术ASP/ASP.NET Core, PHP, Node.Js的变化趋势,发现一下特点. ASP.NET最近几年一直再下降. ASP和 ...
- ipython notebook设置工作路径和自动保存.py文件 ipython_notebook_config.py
在安装完Anaconda,选择了配置环境变量后,打开cmd命令行 1. 打开命令行, 键入 ipython profile create 2. 键入 , 根据这个地址, 打开profile所在的文件夹 ...
- 通过DIV+span方式模拟进度条的实现方法
上上周用FusionCharts做报表时,有个图是进度条的形式,其实在FusionCharts 3.0之后已经支持了(Linear Gauge),可惜现有系统用的还是1.2.3版本的,重新引入新版本有 ...