问题现象
本人最近发现写的几个项目都会遇到一个严重的坑,程序在获取某些数据之后莫名崩溃(其实很早就发现了,只是不想去解决)。原因:由于服务器返回数据的字段偶尔有NULL类型存在,然后以Json形式返回给客户端时就会出现这样的数据,如果直接赋值给其他对象就会造成崩溃。
解决方法
一、如果你使用AFNetwork 这个库做网络请求的话,可以用以下代码,自动帮你去掉这个讨厌的空值
AFNetWorking移除空值二、创建一个字典的分类
.h文件
#import <Foundation/Foundation.h>
@interfaceNSDictionary (SetNullStr)
+(id)changeType:(id)myObj;
@end
.m文件
#import"NSDictionary+SetNullStr.h"
@implementationNSDictionary (SetNullStr)
//将NSDictionary中的Null类型的项目转化成@""
+(NSDictionary*)nullDic:(NSDictionary*)myDic
{
NSArray*keyArr = [myDicallKeys];
NSMutableDictionary*resDic = [[NSMutableDictionaryalloc]init];
for(inti =0; i < keyArr.count; i ++)
{
idobj = [myDicobjectForKey:keyArr[i]];
obj = [selfchangeType:obj];
[resDicsetObject:objforKey:keyArr[i]];
}
returnresDic;
}
//将NSArray中的Null类型的项目转化成@""
+(NSArray*)nullArr:(NSArray*)myArr
{
NSMutableArray*resArr = [[NSMutableArrayalloc]init];
for(inti =0; i < myArr.count; i ++)
{
idobj = myArr[i];
obj = [selfchangeType:obj];
[resArraddObject:obj];
}
returnresArr;
}
//将NSString类型的原路返回
+(NSString*)stringToString:(NSString*)string
{
returnstring;
}
//将Null类型的项目转化成@""
+(NSString*)nullToString
{
return@"";
}
//主要方法
//类型识别:将所有的NSNull类型转化成@""
+(id)changeType:(id)myObj
{
if([myObjisKindOfClass:[NSDictionaryclass]])
{
return[selfnullDic:myObj];
}
else if([myObjisKindOfClass:[NSArrayclass]])
{
return[selfnullArr:myObj];
}
else if([myObjisKindOfClass:[NSStringclass]])
{
return[selfstringToString:myObj];
}
else if([myObjisKindOfClass:[NSNullclass]])
{
return[selfnullToString];
}
else
{
returnmyObj;
}
}
@end
需要转换的时候调用以下方法就OK了,不管有多少个层级,全部转换
//json表示获取到的带有NULL对象的json数据
NSDictionary*newDict = [NSDictionary changeType:json];
三、终极方案
在网上查询各种方案,最后在GitHub找到一个三方Category,叫做NullSafe ,在运行时操作,把这个讨厌的空值置为nil,而nil是安全的,可以向nil对象发送任何message而不会奔溃。这个category使用起来非常方便,只要加入到了工程中就可以了,你其他的什么都不用做。详细的请去Github上查看:https://github.com/nicklockwood/NullSafe
网友评论