解决服务器返回NSNull问题

iOS 奇技yin巧–解决服务器返回NSNull问题

奇技yin巧 指过于奇巧而无益的技艺与制品.

转载请注明出处

系列文章请看

问题描述

众所周知,服务器返回的数据时不时的就不靠谱一下

{“名字”:”漂亮妹子”,”备胎们”:,”年纪”:18}

明明木有备胎, 结果返回@[]也好啊, 偏偏返回一个null. 这个时候呢, 我们native端就得在取倒数据的时候, 先判断类型是不是NSArray 还得判断非空

NSArray *boys = data[@”备胎们”];if ([boys isKindOfClass:[NSArray class]] && boys.count > 0){doSomething}

校验的代码写多了总是很影响心情, 服务器就不能加个空的就不返回或者返回@[]么, 就不能让我们安心的写个备胎1号 = boys[0]么?

让我们来看看奇技的解决办法吧.

思路:重写NSNull的消息转发方法, 让他能处理这些异常的方法.

消息转发的相关知识不了解的同学需要自行搜索下. 在写的时候,我们要考虑 @””,@0,@{},@[]这几种常用的类型空值, 再问到NSNull的一些不属于它的方法的时候, 如果那些空值可以响应的时候就丢给他们去处理去.

= boys.count;

奇技有了, 接着是yin巧.

如果我们要二号备胎囧么办?

id boy = boys[1];

这可就直接越界了啊. 我们仔细的看下NSArray里的方法, 是不是发现一个规律, 基本上返回的是id类型的是取里面的元素的. 既然这样, 那么我们就干脆只要你问NSArray里要一个元素, 我就都返回’nil’给你.

if (strcmp(anInvocation.methodSignature.methodReturnType, “@”) == 0){anInvocation.selector = @selector(__uxy_nil);[anInvocation invokeWithTarget:self];return;}- (id)__uxy_nil{return nil;}

完整的代码如下

((XY_InternalNullExtention)- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector{NSMethodSignature *signature = [super methodSignatureForSelector:selector];if (signature != nil) return signature;for (NSObject *object in UXY_NullObjects){signature = [object methodSignatureForSelector:selector];if (signature){if (strcmp(signature.methodReturnType, “@”) == 0){signature = [[NSNull null] methodSignatureForSelector:@selector(__returnNil)];}break;}}return signature;}- (void)forwardInvocation:(NSInvocation *)anInvocation{if (strcmp(anInvocation.methodSignature.methodReturnType, “@”) == 0){anInvocation.selector = @selector(__uxy_nil);[anInvocation invokeWithTarget:self];return;}for (NSObject *object in UXY_NullObjects){if ([object respondsToSelector:anInvocation.selector]){[anInvocation invokeWithTarget:object];return;}}[self doesNotRecognizeSelector:anInvocation.selector];}- (id)__uxy_nil{return nil;}@end

测试的代码

UXY_EXPECTED( ((NSArray *)[NSNull null])[1] == nil );UXY_EXPECTED( ((NSDictionary *)[NSNull null])[nil] == nil );UXY_EXPECTED( [((NSString *)[NSNull null]) substringToIndex:2] == nil );

这个文件在我的开源库的NSNull+XY文件里, 若果本文对你有所启发, 欢迎给个star. https://github.com/uxyheaven/XYQuick

,奋斗令我们的生活充满生机,责任让我们的生命充满意义!

解决服务器返回NSNull问题

相关文章:

你感兴趣的文章:

标签云: