問(wèn)題現(xiàn)象

本人最近發(fā)現(xiàn)寫的幾個(gè)項(xiàng)目都會(huì)遇到一個(gè)嚴(yán)重的坑,程序在獲取某些數(shù)據(jù)之后莫名崩潰(其實(shí)很早就發(fā)現(xiàn)了,只是不想去解決)。原因:由于服務(wù)器返回?cái)?shù)據(jù)的字段偶爾有NULL類型存在,然后以Json形式返回給客戶端時(shí)就會(huì)出現(xiàn)這樣的數(shù)據(jù),如果直接賦值給其他對(duì)象就會(huì)造成崩潰。
解決方法
一、如果你使用AFNetwork 這個(gè)庫(kù)做網(wǎng)絡(luò)請(qǐng)求的話,可以用以下代碼,自動(dòng)幫你去掉這個(gè)討厭的空值

二、創(chuàng)建一個(gè)字典的分類
.h文件
#import <Foundation/Foundation.h>
@interfaceNSDictionary (SetNullStr)
+(id)changeType:(id)myObj;
@end
.m文件
#import"NSDictionary+SetNullStr.h"
@implementationNSDictionary (SetNullStr)
//將NSDictionary中的Null類型的項(xiàng)目轉(zhuǎn)化成@""
+(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類型的項(xiàng)目轉(zhuǎn)化成@""
+(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類型的項(xiàng)目轉(zhuǎn)化成@""
+(NSString*)nullToString
{
return@"";
}
//主要方法
//類型識(shí)別:將所有的NSNull類型轉(zhuǎn)化成@""
+(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
需要轉(zhuǎn)換的時(shí)候調(diào)用以下方法就OK了,不管有多少個(gè)層級(jí),全部轉(zhuǎn)換
//json表示獲取到的帶有NULL對(duì)象的json數(shù)據(jù)
NSDictionary*newDict = [NSDictionary changeType:json];
三、終極方案
在網(wǎng)上查詢各種方案,最后在GitHub找到一個(gè)三方Category,叫做NullSafe ,在運(yùn)行時(shí)操作,把這個(gè)討厭的空值置為nil,而nil是安全的,可以向nil對(duì)象發(fā)送任何message而不會(huì)奔潰。這個(gè)category使用起來(lái)非常方便,只要加入到了工程中就可以了,你其他的什么都不用做。詳細(xì)的請(qǐng)去Github上查看:https://github.com/nicklockwood/NullSafe