iOS 数据请求类AFNetworking 简单封装

来源:互联网 发布:淘宝助理去除被修改 编辑:程序博客网 时间:2024/05/01 01:45

       iOS 开发中,无非就是界面搭建以及数据配置 .今天我们就对我们常用的第三方请求类AFNetworking 再进行简单的封装.让我们的代码书写更加简洁.耦合性更低!

      如果你想了解并使用常用控件的封装,请参考我的另一篇博客文章iOS 常用控件的封装以及调用.

      大家知道, AF 其实已经是对数据请求类的封装了,但是我们在项目中用到最多的 get 或 post 请求 .不能每次都把 AF 的方法都写一遍把,显得代码累赘,也让开发过程显得枯燥!这时,我们可以单独封装出来一个请求类,使用中就如同调用系统的一个协议方法那样简单,同样做到数据请求需求! 不多说,下面看代码:

     首先需要 cocoapods 集成 AFNetworking(这个步骤就不用多说了). 创建一个数据请求类 继承NSObject


       //如果你想统一的加入缓存圈,你也可以在工程中集成 SVProgressHUD并导入头文件.

         如下: .h 文件中我们创建了两个方法 get 和 post 方法


#import <Foundation/Foundation.h>

#import <AFNetworking.h>

#import <SVProgressHUD.h>



@interface SL_AFNetworking : NSObject




/*------   批注   ------*


 ///本整理内容需要导入第三方库:   AFNetworking   /  SVProgressHUD

 

 *  get请求  并通过block返回json数据

 *  URLString  ----> 网络地址

 *  parameters  ----> 参数请求体

 *  success       ----> 请求成功

 *  failure         ----> 请求失败


 */

//创建get请求

+(void)SL_NetworkingForGET:(nullable NSString *)URLString parameters:( nullable NSDictionary *)parameters success:(nullablevoid(^)(id_Nonnull json))success failure:(nullablevoid(^)(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error))failure;


//创建post请求

+(void)SL_NetworkingForPOST:(nullable NSString *)URLString parameters:( nullable NSDictionary *)parameters success:(nullablevoid(^)(id_Nonnull json))success failure:(nullablevoid(^)(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error))failure;


@end


    接下来我们跳到. m 文件中实现这两个方法:

#import "SL_AFNetworking.h"


@implementation SL_AFNetworking


//实现单例请求类对象

+(AFHTTPSessionManager *)shareManager;

{

    static AFHTTPSessionManager * manager;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        manager =[AFHTTPSessionManager manager];

        manager.responseSerializer.acceptableContentTypes =[NSSet setWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/html",@"text/plain",nil];

        [manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];

        manager.requestSerializer.timeoutInterval = 15.f;

        [manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];


        

    });

    return manager;

}


+(AFHTTPSessionManager *)manager;

{

    AFHTTPSessionManager * manager =[AFHTTPSessionManager manager];

    manager.securityPolicy.allowInvalidCertificates =true;


    return manager;

}


//创建get请求

+(void)SL_NetworkingForGET:(nullable NSString *)URLString parameters:( nullable NSDictionary *)parameters success:(nullablevoid(^)(id_Nonnull json))success failure:(nullablevoid(^)(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error))failure;

{

  //字符串处理

    NSString * string =[URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:URLString]];

    [SVProgressHUD showWithStatus:@"数据加载中... "];

    //数据请求

    [[SL_AFNetworking shareManager]GET:string parameters:parameters progress:^(NSProgress *_Nonnull downloadProgress) {

        

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

        [SVProgressHUD dismiss];

        if (success) {

            // --- > 字典类型 --- > json数据 --- >解析数据并传值

            NSError * error =nil;

            if (error !=nil) {

                [SVProgressHUD showErrorWithStatus:@"数据解析失败,请稍后尝试!"];

                return ;

            }

            success(responseObject);

        }

        

        

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

        

        [SVProgressHUD showErrorWithStatus:@"请求数据失败,请检查网络后重试!"];

        if (failure) {

            failure(task,error);

        }

    }];


}

//创建post请求

+(void)SL_NetworkingForPOST:(nullable NSString *)URLString parameters:( nullable NSDictionary *)parameters success:(nullablevoid(^)(id_Nonnull json))success failure:(nullablevoid(^)(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error))failure;

{

   //字符串处理

    NSString * string =[URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:URLString]];

    [SVProgressHUD showWithStatus:@"数据加载中... "];


 [[SL_AFNetworking shareManager]POST:string parameters:parameters progress:^(NSProgress *_Nonnull uploadProgress) {

     

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

     [SVProgressHUD dismiss];

     if (success) {

         // --- > 字典类型 --- > json数据 --- >解析数据并传值

         NSError * error =nil;

         if (error !=nil) {

             [SVProgressHUD showErrorWithStatus:@"数据解析失败,请稍后尝试!"];

             return ;

         }

         success(responseObject);

     }


     

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

     

     [SVProgressHUD showErrorWithStatus:@"请求数据失败,请检查网络后重试!"];

     if (failure) {

         failure(task,error);

     }

 }];

}


@end


  到此,我们的请求类书写完成,如果在其它类中使用到数据请求时,直接导入请求类头文件,并用类名调用 get 或者 post 方法并加入对应参数就可以了,我们的数据请求再也不会繁琐,杂乱无章!

  代码整理还不够完善,如果有好的建议,请在下边留言, 如果对文章感兴趣,欢迎关注小白博客或加入公共讨论群: 234713941  

0 0
原创粉丝点击