美文网首页
NSDictionary中读取到'null'值时

NSDictionary中读取到'null'值时

作者: 曹波波 | 来源:发表于2017-07-03 10:47 被阅读139次

    在iOS app开发中,偶尔会出现这种场景,由于后台人员对于接口数据没有做空值处理,导致客户端接收到的有些数据为空(NSNull),而针对此类数据恰好客户端的存储结构为int和float类型,类型转换时报出了[NSNull intValue]或者[NSNull floatValue] unrecognized selector sent to instance 的错误。

    这个问题产生的原因是,后端采用框架统一处理接口,或者在对接口的处理中,字段处理不严谨,例如:

    • 缺失key
    • key对应的类型不对
    • key的值为空,但读出的为‘null’
    • 其他类型的既无法判nil,也没法读取值的情况

    这种情况下的处理方法,按照防御性编程的思路处理,即:在对NSDictionary取值的时候,先做判空处理,不是正常值,或者说不是预期的type,就将obj转成nil处理。

    我的处理方法如下:
    增加一个NSDictionary的 (NullResult) 分类:

    //
    //  NSDictionary+NullResult.h
    //  triprice
    //
    //
    
    #import <Foundation/Foundation.h>
    
    @interface NSDictionary (NullResult)
    
    
    /**
     *  objectForKeyNotNull
     *
     *  @param key key
     *
     *  @return return valueNotNull
     */
    -(id)objectForKeyNotNull:(id)key;
    
    @end
    
    //
    //  NSDictionary+NullResult.h
    //  triprice
    //
    //
    
    #import "NSDictionary+NullResult.h"
    
    @implementation NSDictionary (NullResult)
    
    
    -(id)objectForKeyNotNull:(id)key
    {
        id object = [self objectForKey:key];
        if ([object isKindOfClass:[NSNumber class]] ||
            [object isKindOfClass:[NSString class]] ||
            [object isKindOfClass:[NSArray class]] ||
            [object isKindOfClass:[NSDictionary class]])
        {
            return object;
        }
        return nil;
    }
    
    
    @end
    
    

    使用的时候,直接

    NSArray * arr = [dict objectForKeyNotNull:"key"];
    

    即可。

    PS:
    1)这个方法其实算是权益之计。在项目告一段落的时候,还是要仔细的梳理相应的业务逻辑或者代码逻辑,找出这种偶尔出现‘null’或者其他造成 dictionary 取值异常的原因。

    2)这个分类,深入研究,是可以使用runtime来对dictionary 做面向切面(Aspect Oriented Programming)的处理,即,通过runtime监控 -(id)objectForKey: 方法的使用,并作出判空处理。而不用,在每一处用到取值的地方,把这个方法替换成 -(id)objectForKeyNotNull:(id)key 做侵入式的开发。
    具体在这篇文章中,做了详细的探讨:
    NSDictionary的runtime的一些探讨
    http://www.jianshu.com/p/d0bfc54bd6ef

    当然,这样做,每一次都做了额外的处理,虽然增加了程序运行的稳定性,但也增加了相应的开销。因此,这方面的使用,还是需要开发者做一下权衡。

    后续跟踪:
    NSDictionary的runtime的一些探讨
    https://www.jianshu.com/p/d0bfc54bd6ef

    相关文章

      网友评论

          本文标题:NSDictionary中读取到'null'值时

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