AFNetworking3.1.0源码分析(十二)AFURLResponseSerialization

来源:互联网 发布:网络直播间装修效果图 编辑:程序博客网 时间:2024/05/16 18:44

一:AFURLResponseSerialization 和 AFURLRequestSerialization 是一对出现在网络处理中,AFURLResponseSerialization主要负责对网络请求完成之后返回的结果做解析处理。

分析AFURLResponseSerialization.h  可得到,相关类的结构如下图所示:


二:提供json解析是去除空值功能:

static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) {    if ([JSONObject isKindOfClass:[NSArray class]]) {        NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]];        for (id value in (NSArray *)JSONObject) {            [mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)];        }        return (readingOptions & NSJSONReadingMutableContainers) ? mutableArray : [NSArray arrayWithArray:mutableArray];    } else if ([JSONObject isKindOfClass:[NSDictionary class]]) {        NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:JSONObject];        for (id <NSCopying> key in [(NSDictionary *)JSONObject allKeys]) {            id value = (NSDictionary *)JSONObject[key];            if (!value || [value isEqual:[NSNull null]]) {                [mutableDictionary removeObjectForKey:key];            } else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) {                mutableDictionary[key] = AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions);            }        }        return (readingOptions & NSJSONReadingMutableContainers) ? mutableDictionary : [NSDictionary dictionaryWithDictionary:mutableDictionary];    }    return JSONObject;}
其中的:NSJSONReadingOptions含义如下:

/*     NSJSONReadingMutableContainers:返回可变容器     NSJSONReadingMutableLeaves:返回的JSON对象中字符串的值为NSMutableString     NSJSONReadingAllowFragments:允许JSON字符串最外层既不是NSArray也不是NSDictionary,但必须是有效的JSON Fragment。例如使用这个选项可以解析 @“123” 这样的字符串          */
二:

AFCompoundResponseSerializer 是个符合类型的,可以设置多种解析方式处理方式如下代码:

+ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers {    //设置可以接收的解析类型对象    AFCompoundResponseSerializer *serializer = [[self alloc] init];    serializer.responseSerializers = responseSerializers;    return serializer;}#pragma mark - AFURLResponseSerialization- (id)responseObjectForResponse:(NSURLResponse *)response                           data:(NSData *)data                          error:(NSError *__autoreleasing *)error{    //循环解析,遇见可以解析的类解析数据,如果解析数据为空,继续执行其它的解析方式    for (id <AFURLResponseSerialization> serializer in self.responseSerializers) {        if (![serializer isKindOfClass:[AFHTTPResponseSerializer class]]) {            continue;        }        NSError *serializerError = nil;        id responseObject = [serializer responseObjectForResponse:response data:data error:&serializerError];        if (responseObject) {            if (error) {                *error = AFErrorWithUnderlyingError(serializerError, *error);            }            return responseObject;        }    }    return [super responseObjectForResponse:response data:data error:error];}



0 0
原创粉丝点击