OC 开发分类(Category)iOS DeveloperiOS学习笔记

NSDictionary分类CLNull(解决服务器返回的jso

2017-05-25  本文已影响121人  逍遥晨旭

我们在处理服务器返回的数据类型为NSNull时,程序就会闪退。我们可以先判断该数据类型是否为NSNull,是就返回,不是在使用它。但这是不是太麻烦累。NSDictionary分类CLNull就是为解决这个问题来的。

思路:

给NSDictionary添加分类,对外提供一个+(id)changeType:(id)object方法。将Null类型的项目转化成@""。

效果:

效果图

具体实现如下(代码中有必要的注释):

//将NSDictionary中的Null类型的项目转化成@""
+(NSDictionary *)nullDic:(NSDictionary *)dict
{
    NSArray *keyArr = [dict allKeys];
    NSMutableDictionary *resDic = [[NSMutableDictionary alloc]init];
    for (int i = 0; i < keyArr.count; i ++)
    {
        id obj = [dict objectForKey:keyArr[i]];
        
        obj = [self changeType:obj];
        
        [resDic setObject:obj forKey:keyArr[i]];
    }
    return resDic;
}

//将NSArray元素中的NSDictionary中的Null类型的项目转化成@""
+(NSArray *)nullArr:(NSArray *)array
{
    NSMutableArray *resArr = [[NSMutableArray alloc] init];
    for (int i = 0; i < array.count; i ++)
    {
        id obj = array[i];
        
        obj = [self changeType:obj];
        
        [resArr addObject:obj];
    }
    return resArr;
}

//将NSString类型的原路返回
+(NSString *)stringToString:(NSString *)string
{
    return string;
}

//将NSString为Null类型的转化成@""
+(NSString *)nullToString
{
    return @"";
}

#pragma mark - 公有方法
//类型识别:将所有的NSNull类型转化成@""
+(id)changeType:(id)object
{
    if ([object isKindOfClass:[NSDictionary class]]){
        return [self nullDic:object];
    }
    else if([object isKindOfClass:[NSArray class]]){
        return [self nullArr:object];
    }
    else if([object isKindOfClass:[NSString class]]){
        return [self stringToString:object];
    }
    else if([object isKindOfClass:[NSNull class]]){
        return [self nullToString];
    }
    else{
        return object;
    }
}

使用方法:

[NSDictionary changeType:dict];

第二种方法是利用AFNetworking的自动解析,去除掉值为null的键值对,代码如下:

_manager = [AFHTTPRequestOperationManager manager];  
AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];  
response.removesKeysWithNullValues = YES;  
_manager.responseSerializer = response;  
_manager.requestSerializer = [AFJSONRequestSerializer serializer];  

第三种方式: 使用 nullSafe ,只需将.m 拖进工程即可

https://github.com/nicklockwood/NullSafe

上一篇下一篇

猜你喜欢

热点阅读