iOS开发零散知识

关于添加AFNetworking返回的数据类型

2016-12-02  本文已影响614人  上发条的树

1、从AFNetworking的源码里可以看出,默认支持的返回数据类型如下几个:

- (instancetype)init {
    self = [super init];
    if (!self) {
        return nil;
    }

    self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];

    return self;
}

如果想要支持其他的数据类型,例如@"text/html", @"text/xml",那么,这样添加支持类型:

@interface MyHttp : AFHTTPSessionManager

+(instancetype)sharedInstance;

@end
@implementation MyHttp

+(instancetype)sharedInstance{
    static MyHttp *myHttp = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //URL
        myHttp = [[MyHttp alloc]initWithBaseURL:[NSURL URLWithString:xBaseUrl]];
        
        //添加返回数据的类型支持
        NSMutableSet *acceptableSet = [NSMutableSet setWithSet:myHttp.responseSerializer.acceptableContentTypes];
        [acceptableSet addObject:@"text/html"];
        myHttp.responseSerializer.acceptableContentTypes = acceptableSet;
        
    });
}

-(instancetype)initWithBaseURL:(NSURL *)url{
    self = [super initWithBaseURL:url];
    if (self) {
    }
    return self;
}
@end

成功添加了返回数据的支持类型,解析数据的时候,就可以根据接口的文档,做相应的处理。(一般我都是不在AFNetworking二次封装里面做判断,都是到业务层再去判断,因为项目中大部分的接口都是返回json,只有一两个接口是返回其他其他类型的数据)当然如果非要判断数据,也是可以的:

if([responseObject isKindOfClass:[NSDictionary class]]){
    NSLog(@"%@",responseObject);
 }
  //xml/html
else if([responseObject isKindOfClass:[NSData class]]){
    NSLog(@"%@",responseObject);
}

如果是网络请求写成一个单例,那么以下这种方式(告诉AFNetworking返回的数据以什么类型去解析)的类型支持就不合适了:

myHttp.responseSerializer = [AFJSONResponseSerializer serializer];
//myHttp.responseSerializer = [AFXMLParserResponseSerializer serializer];

设置了一种类型,如上,就只支持json类型。如果是返回xml,那么就会报错。所以单例的话,还是添加支持类型比较合适,返回的时候再根据具体类型做具体处理。

上一篇下一篇

猜你喜欢

热点阅读