美文网首页
iOS服务器返回数据null,操作数据崩溃

iOS服务器返回数据null,操作数据崩溃

作者: lionsom_lin | 来源:发表于2017-11-09 17:45 被阅读449次

    文件参考:

    一、问题

    客户端与服务器之间的数据请求一般以Json形式传递,正常有null值。
    这个数据类型不是nil 也不是 String。 解析成对象之后,如果直接向这个对象发送消息(eg:length,count 等等)就会直接崩溃。提示错误为:

    -[NSNull length]: unrecognized selector sent to instance 0x388a4a70
    

    二、实战场景

    数据为null 调用.length操作 崩溃。。。

    三、解决方案

    方案一:解析后进行判断
    //方法一
    if( [m isEqual:[NSNull null]] )
    { 
        NSLog(@"<null>");
    }
    //方法二
    if ( ![isKindOfClass:[NSNull class]] )
    {
        // 操作
    }
    
    方案二:AFN

    如果你使用AFNetwork 这个库做网络请求的话,可以用以下代码,自动帮你去掉这个讨厌的空值

        removesKeysWithNullValues = YES
    
        _dataSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:baseUrl]];
        [_dataSessionManager setRequestSerializer:[AFJSONRequestSerializer serializer]];  //告诉AFN使用JSON格式,AFN内部会自动转JSON
    
        AFJSONResponseSerializer * response = [AFJSONResponseSerializer serializer];
        response.removesKeysWithNullValues = YES;
        
        [_dataSessionManager setResponseSerializer:response];  //以JSON格式返回
        _dataSessionManager.requestSerializer.timeoutInterval = 10;
    
    方案三:利用Category将nil转为@""
    使用案例

    代码如下 :

    #import <Foundation/Foundation.h>
    
    @interface NSDictionary (DeleteNull)
    
    +(id)changeType:(id)myObj;
    
    @end
    
    //
    //  NSDictionary+DeleteNull.m
    //  PAL-iOS
    //
    //  Created by linxiang on 2017/11/1.
    //  Copyright © 2017年 minxing. All rights reserved.
    //
    
    #import "NSDictionary+DeleteNull.h"
    
    @implementation NSDictionary (DeleteNull)
    
    #pragma mark - 私有方法
    //将NSDictionary中的Null类型的项目转化成@""
    +(NSDictionary *)nullDic:(NSDictionary *)myDic
    {
        NSArray *keyArr = [myDic allKeys];
        NSMutableDictionary *resDic = [[NSMutableDictionary alloc]init];
        for (int i = 0; i < keyArr.count; i ++)
        {
            id obj = [myDic objectForKey:keyArr[i]];
            
            obj = [self changeType:obj];
            
            [resDic setObject:obj forKey:keyArr[i]];
        }
        return resDic;
    }
    
    //将NSArray中的Null类型的项目转化成@""
    +(NSArray *)nullArr:(NSArray *)myArr
    {
        NSMutableArray *resArr = [[NSMutableArray alloc] init];
        for (int i = 0; i < myArr.count; i ++)
        {
            id obj = myArr[i];
            
            obj = [self changeType:obj];
            
            [resArr addObject:obj];
        }
        return resArr;
    }
    
    //将NSString类型的原路返回
    +(NSString *)stringToString:(NSString *)string
    {
        return string;
    }
    
    //将Null类型的项目转化成@""
    +(NSString *)nullToString
    {
        return @"";
    }
    
    #pragma mark - 公有方法
    //类型识别:将所有的NSNull类型转化成@""
    +(id)changeType:(id)myObj
    {
        if ([myObj isKindOfClass:[NSDictionary class]])
        {
            return [self nullDic:myObj];
        }
        else if([myObj isKindOfClass:[NSArray class]])
        {
            return [self nullArr:myObj];
        }
        else if([myObj isKindOfClass:[NSString class]])
        {
            return [self stringToString:myObj];
        }
        else if([myObj isKindOfClass:[NSNull class]])
        {
            return [self nullToString];
        }
        else
        {
            return myObj;
        }
    }
    
    @end
    

    --------------------------------

    相关文章

      网友评论

          本文标题:iOS服务器返回数据null,操作数据崩溃

          本文链接:https://www.haomeiwen.com/subject/cqabpxtx.html