基于AFNetWorking 3.0封装网络请求数据的类

  对于使用 AFNetworking 的朋友来说,很多朋友都是直接调用 AFNetworking的 API ,这样不太好,无法做到全工程统一配置。 

  最好的方式就是对网络层再封装一层,全工程不允许直接使用 AFNetworking 的 API ,必须调用我们自己封装的一层,如此一来,任何网络配置都可以在这一层里配置好,使用的人无须知道里面在干嘛,只管调用就可以了。

  本篇为基于AFNetworking3.0的版本,支持iOS7及其以上版本。

  

  基于NSObject的类创建一个继承于NSObject类的命名为(个人命名)NetManager的类。

  在.h文件中

  

  #import "AFNetworking.h"

  typedef  void(^DownLoadFinishedBlock)(id responseObj);

  typedef void (^DownLoadFialedBlock)(NSError*error);

 

  @interface NetManager : NSObject

   GET请求数据的方法

  +(void)doGetWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed;

  POST请求数据的方法

  +(void)doPostWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed;

 

@end

DownLoadFinishedBlock 是响应成功的回调,返回的是id类型,外部再转换成类型模型就可以了。 

DownLoadFialedBlock 是响应失败的回调,只有一个 NSError 对象,外部可接收处理。

在.m文件中

GET请求的处理:

+(void)doGetWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed{

    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:type, nil];

    

    [manager GET:urlString parameters:dic progress:^(NSProgress * _Nonnull downloadProgress) {

        

        // 这里可以获取到目前的数据请求的进度

        

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        

        // 请求成功,解析数据

        finished(responseObject);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        

        // 请求失败

        fialed(error);

    }];

}

 

POST请求的处理:

+(void)doPostWithUrlStr:(NSString*)urlString parameters:(NSDictionary*)dic contentType:(NSString*)type finished:(DownLoadFinishedBlock)finished failure:(DownLoadFialedBlock)fialed

{

    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:type, nil];

    

    [manager POST:urlString parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

        

        // 拼接data到请求体,这个block的参数是遵守AFMultipartFormData协议的。

        

    } progress:^(NSProgress * _Nonnull uploadProgress) {

        

        // 这里可以获取到目前的数据请求的进度

        

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        // 请求成功,解析数据

        finished(responseObject);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        // 请求失败

        fialed(error);

    }];

}

  下面是在一个例子,就是在自己的项目中,调用自己封装好的类;

  假如点击按钮时下载数据

  在该控制器类中,调用之前封装的方法即可。

  

  #import "NetManager.h"

  

  在按钮点击事件里执行下方方法即可:

-(void)btnClicked:(UIButton *)btn{

    

        NSMutableDictionary *dict = [NSMutableDictionary dictionary];

        [dict setValue:@"1" forKey:@"type"];

        [dict setValue:@"1" forKey:@"placed"];

    [NetManager doGetWithUrlStr:@"http://app.youmyou.com/index.aspx?" parameters:dict contentType:@"text/html" finished:^(id responseObj) {

        //对responseObj做对应的操作即可

    //eg:

              id json = [NSJSONSerialization JSONObjectWithData:responseObj options:NSJSONReadingMutableContainers error:nil];

        NSLog(@"json = %@",json);

        

    } failure:^(NSError *error) {

         NSLog(@"%@",error.description);

    }];  

 

原文地址:https://www.cnblogs.com/MasterPeng/p/5333608.html