iOS项目中由于后台数据返回null导致的错误解决
来源:互联网 发布:北京时间 网络延迟 编辑:程序博客网 时间:2024/05/11 05:19
iOS项目中由于后台数据返回null导致的错误解决
一、需求描述
iOS开发,接口数据返回出现null,导致项目直接崩溃的问题。这边其实14年就处理过,之前是model里面做了一个冗余判断处理。15年的时候,找到了一个开源库,NullSafe文件。
这边也是在年初的时候,朋友问到了这个问题,当时候就上传这个库文件到了CSDN上。
最近新接手的项目也遇到了这个问题,之前出现这个问题都是后台去做处理。毕竟以前做过,但是之前没有做文本记录,应工作需要,做了这个null兼容处理,顺便这次就记录下。希望对自己,对别人都有点用处吧。
我记得以前我处理这个问题的时候,参考了一篇总结性的文字,分享了好几种方法,我这边由于开发进度需要,暂时没有去给大家找以前的那篇文字了。
二、使用方法
1、下载这个库文件
NullSafe开源库下载地址
2、解压文件之后,直接将NullSafe.m文件导入到项目中就行了。
导入文件截图如下:
后记:
这边将我参考的文章写在下面,感觉总结的挺好的。
参考文章链接
在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式。
问题现象
但是几个项目下来一直遇到一个坑爹的问题,程序在获取某些数据之后莫名崩溃。其实很早就发现了原因:由于服务器的数据库中有些字段为空,然后以Json
形式返回给客户端时就会出现这样的数据:
"somevalue":null
通过JsonKit
这个第三方库解析出来的数据就成了
somevalue = "<null>";
这个数据类型不是nil
也不是 String
。 解析成对象之后,如果直接向这个对象发送消息(eg:length,count
等等)就会直接崩溃。提示错误为:
-[NSNull length]: unrecognized selector sent to instance 0x388a4a70
解决方法
其实一直没有找到完美的解决办法,坑了我很久。
1、最开始的解决方法就是为了应付当前遇到的崩溃,看看哪个字段可能为空,那么就对该字段使用前进行判断,通过崩溃时的错误提示可以看出,这样的字段解析成的对象是 NSNull 类型的,所以可以直接判断是不是此类型:
if (![isKindOfClass:[NSNull class]]){xxxxxxx;}
因为字段实在太多,就找一个补一个。
2、 后来想彻底解决这问题,就打算从数据源下手,其实应该可以用正则表达式匹配这个null
,然后进行替换,奈何正则是我的硬伤啊。于是就相出了一个山寨方法:字符串匹配。在获取到服务器返回的Json
时,返回结果时string
对象,于是就先 替换 null
为 为空字符””
,然后再解析。
json = [jsonStr stringByReplacingOccurrencesOfString:@":null" withString:@":\"\""];
这个方法本来很奏效,但是我这里的服务器返回极不简洁,各种垃圾数据(不吐槽这了)。。。反正这样会导致json
无法解析了。
3、最后没有办法,只能在解析的时候下手,把是NSNull
类型的值替换成nil
。 一般就写个tool
方法,然后解析时调用。但是嫌太麻烦,就想弄写个宏,通过搜索惊奇的发现宏也是可以有返回值的,结果如下:
#define VerifyValue(value)\({id tmp;\if ([value isKindOfClass:[NSNull class]])\tmp = nil;\else\tmp = value;\tmp;\})\
宏里的最后一句语句便是返回值。然后在解析数据时调用宏:
contact.contactPhone = VerifyValue(contactDic[@"send_ContactPhone"]);
4、如果你使用AFNetwork
这个库做网络请求的话,可以用以下代码,自动帮你去掉这个讨厌的空值
self.removesKeysWithNullValues = YES;
5、终极方案
终 于找到了一劳永逸的方案,牛逼的老外写了一个Category
,叫做NullSafe
,在运行时操作,把这个讨厌的空值置为nil
,而nil是安全的,可以向nil
对象发送任何message
而不会奔溃。这个category
使用起来非常 方便,只要加入到了工程中就可以了,你其他的什么都不用做,对,就是这么简单。详细的请去Github
上查看;
https://github.com/nicklockwood/NullSafe
- iOS项目中由于后台数据返回null导致的错误解决
- iOS项目中由于后台数据返回null导致的错误解决
- iOS中解决后台返回的null导致的崩溃问题
- 解决返回数据中存在Null而导致的错误问题
- iOS项目开发中,对后台返回数据为<null>时候的处理,避免取值产生程序崩溃问题
- iOS开发中后台返回null,<null>字段的处理
- 项目中字符串null与null不同导致的错误
- iOS 去除后台返回的数据的null值
- iOS-数据返回字段null、<null>导致的程序crash问题解决
- IOS 返回JSON数据中存在NULL的解决办法
- 一次由于设置错误,导致无法进入gnome的解决。
- 解决使用 model 时后台返回 null 或 nil 数据而造成的崩溃问题
- 解决项目中由于前端页面数据类型跟数据库类型不一致,导致获取数据为空引起问题
- troubleshooting之解决算子函数返回NULL导致的问题
- iOS JSON返回的数据有NSNull导致程序崩溃及ios nil、NULL和NSNull的区别
- 解决错误指定RequestHeader导致后台接受不到FormData数据的问题
- iOS中由于代理没有释放导致的crash
- iOS 后台返回json解析出现的null的解决办法
- HMI,相识2周年。。
- permutation K
- 元素间的间隙
- 关于小米手机上,修改APP的launcher应用图标不生效的解决方案
- CSS实现Photoshop选区效果
- iOS项目中由于后台数据返回null导致的错误解决
- 3Sum Closest
- VGA信号详解
- 关于webview的知识点
- 二分+贪心——HDU 5855
- MySQL存储过程入门
- Linux自学笔记(二)分区
- HackerRank: Bricks Game
- 代码总结