iOS项目开发中,对后台返回数据为<null>时候的处理,避免取值产生程序崩溃问题
2016-08-26 11:20
621 查看
这里呢是整理的一位老鸟的东西,好东西得分享
大致实现思路就是循环便利做比较,如果发现是NSNull类型的就把值改为空字符串;这样的好处就是当数据请求回来,删除一下数据里面为<null>类型的东西,避免在直接取的时候产生程序崩溃问题;
两个方法,一个返回NSArray,一个是NSDictionary,根据需求选择
.h 文件
/**
* 服务器返回的数据为<null>时的处理
*
* @param dic 经处理过后的数据,数据类型为字典,避免直接取数据时出现程序崩溃现象。
*/
- (NSDictionary *)deleteEmpty:(NSDictionary *)dic;
/**
* 服务器返回的数据为<null>时的处理
*
* @param dic 经处理过后的数据,数据类型为数组,避免直接取数据时出现程序崩溃现象。
*/
- (NSArray *)deleteEmptyArr:(NSArray *)arr;
.m 文件
@implementation NSObject (DeleteArrOrDeleteDicBothNull)
- (NSDictionary *)deleteEmpty:(NSDictionary *)dic
{
NSMutableDictionary *mdic = [[NSMutableDictionary alloc] initWithDictionary:dic];
NSMutableArray *set = [[NSMutableArray alloc] init];
NSMutableDictionary *dicSet = [[NSMutableDictionary alloc] init];
NSMutableDictionary *arrSet = [[NSMutableDictionary alloc] init];
for (id obj in mdic.allKeys)
{
id value = mdic[obj];
if ([value isKindOfClass:[NSDictionary class]])
{
NSDictionary *changeDic = [self deleteEmpty:value];
[dicSet setObject:changeDic forKey:obj];
}
else if ([value isKindOfClass:[NSArray class]])
{
NSArray *changeArr = [self deleteEmptyArr:value];
[arrSet setObject:changeArr forKey:obj];
}
else
{
if ([value isKindOfClass:[NSNull class]]) {
[set addObject:obj];
}
}
}
for (id obj in set)
{
mdic[obj] = @"";
}
for (id obj in dicSet.allKeys)
{
mdic[obj] = dicSet[obj];
}
for (id obj in arrSet.allKeys)
{
mdic[obj] = arrSet[obj];
}
return mdic;
}
- (NSArray *)deleteEmptyArr:(NSArray *)arr
{
NSMutableArray *marr = [NSMutableArray arrayWithArray:arr];
NSMutableArray *set = [[NSMutableArray alloc] init];
NSMutableDictionary *dicSet = [[NSMutableDictionary alloc] init];
NSMutableDictionary *arrSet = [[NSMutableDictionary alloc] init];
for (id obj in marr)
{
if ([obj isKindOfClass:[NSDictionary class]])
{
NSDictionary *changeDic = [self deleteEmpty:obj];
NSInteger index = [marr indexOfObject:obj];
[dicSet setObject:changeDic forKey:@(index)];
}
else if ([obj isKindOfClass:[NSArray class]])
{
NSArray *changeArr = [self deleteEmptyArr:obj];
NSInteger index = [marr indexOfObject:obj];
[arrSet setObject:changeArr forKey:@(index)];
}
else
{
if ([obj isKindOfClass:[NSNull class]]) {
NSInteger index = [marr indexOfObject:obj];
[set addObject:@(index)];
}
}
}
for (id obj in set)
{
marr[(int)obj] = @"";
}
for (id obj in dicSet.allKeys)
{
int index = [obj intValue];
marr[index] = dicSet[obj];
}
for (id obj in arrSet.allKeys)
{
int index = [obj intValue];
marr[index] = arrSet[obj];
}
return marr;
}
@end
大致实现思路就是循环便利做比较,如果发现是NSNull类型的就把值改为空字符串;这样的好处就是当数据请求回来,删除一下数据里面为<null>类型的东西,避免在直接取的时候产生程序崩溃问题;
两个方法,一个返回NSArray,一个是NSDictionary,根据需求选择
.h 文件
/**
* 服务器返回的数据为<null>时的处理
*
* @param dic 经处理过后的数据,数据类型为字典,避免直接取数据时出现程序崩溃现象。
*/
- (NSDictionary *)deleteEmpty:(NSDictionary *)dic;
/**
* 服务器返回的数据为<null>时的处理
*
* @param dic 经处理过后的数据,数据类型为数组,避免直接取数据时出现程序崩溃现象。
*/
- (NSArray *)deleteEmptyArr:(NSArray *)arr;
.m 文件
@implementation NSObject (DeleteArrOrDeleteDicBothNull)
- (NSDictionary *)deleteEmpty:(NSDictionary *)dic
{
NSMutableDictionary *mdic = [[NSMutableDictionary alloc] initWithDictionary:dic];
NSMutableArray *set = [[NSMutableArray alloc] init];
NSMutableDictionary *dicSet = [[NSMutableDictionary alloc] init];
NSMutableDictionary *arrSet = [[NSMutableDictionary alloc] init];
for (id obj in mdic.allKeys)
{
id value = mdic[obj];
if ([value isKindOfClass:[NSDictionary class]])
{
NSDictionary *changeDic = [self deleteEmpty:value];
[dicSet setObject:changeDic forKey:obj];
}
else if ([value isKindOfClass:[NSArray class]])
{
NSArray *changeArr = [self deleteEmptyArr:value];
[arrSet setObject:changeArr forKey:obj];
}
else
{
if ([value isKindOfClass:[NSNull class]]) {
[set addObject:obj];
}
}
}
for (id obj in set)
{
mdic[obj] = @"";
}
for (id obj in dicSet.allKeys)
{
mdic[obj] = dicSet[obj];
}
for (id obj in arrSet.allKeys)
{
mdic[obj] = arrSet[obj];
}
return mdic;
}
- (NSArray *)deleteEmptyArr:(NSArray *)arr
{
NSMutableArray *marr = [NSMutableArray arrayWithArray:arr];
NSMutableArray *set = [[NSMutableArray alloc] init];
NSMutableDictionary *dicSet = [[NSMutableDictionary alloc] init];
NSMutableDictionary *arrSet = [[NSMutableDictionary alloc] init];
for (id obj in marr)
{
if ([obj isKindOfClass:[NSDictionary class]])
{
NSDictionary *changeDic = [self deleteEmpty:obj];
NSInteger index = [marr indexOfObject:obj];
[dicSet setObject:changeDic forKey:@(index)];
}
else if ([obj isKindOfClass:[NSArray class]])
{
NSArray *changeArr = [self deleteEmptyArr:obj];
NSInteger index = [marr indexOfObject:obj];
[arrSet setObject:changeArr forKey:@(index)];
}
else
{
if ([obj isKindOfClass:[NSNull class]]) {
NSInteger index = [marr indexOfObject:obj];
[set addObject:@(index)];
}
}
}
for (id obj in set)
{
marr[(int)obj] = @"";
}
for (id obj in dicSet.allKeys)
{
int index = [obj intValue];
marr[index] = dicSet[obj];
}
for (id obj in arrSet.allKeys)
{
int index = [obj intValue];
marr[index] = arrSet[obj];
}
return marr;
}
@end
相关文章推荐
- iOS开发中 - SDWebImage 的原理及使用流程
- IOS 人机交互指南
- iOS 设置主界面隐藏navigationBar,跳转后显示出来
- iOS 中在开发项目时候常见的通知传值
- iOS弹出框封装好的方法
- iOS常用加密算法介绍和代码实践
- iOS中的数据持久化方式
- iOS备忘录之Xcode折叠代码
- iOS备忘录之Git命令
- iOS备忘录之mac常用命令行
- iOS使用自定义URL实现控制器之间的跳转
- iOS 枚举的巧用
- 遭遇Crash文件战:教你如何搞定iOS崩溃日志
- iOS性能优化:Instruments工具
- iOS开发之原来Runtime的黑魔法这么厉害
- IOS代码实现自动布局
- GCDAsyncSocket不通过服务器进行客户端间直接连接—iOS移动开发
- IOS 消息机制(NSNotificationCenter)
- iOS使用自定义URL实现控制器之间的跳转
- IOS中的数据持久化之沙盒篇