iOS 数据请求类AFNetworking 简单封装

       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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
缓存策略 typedef NS_ENUM(NSUInteger, YBCacheType){ YBCacheTypeReturnCacheDataThenLoad = 0,///< 有缓存就先返回缓存,同步请求数据 YBCacheTypeReloadIgnoringLocalCacheData, ///< 忽略缓存,重新请求 YBCacheTypeReturnCacheDataElseLoad,///< 有缓存就用缓存,没有缓存就重新请求(用于数据不变时) YBCacheTypeReturnCacheDataDontLoad,///< 有缓存就用缓存,没有缓存就不发请求,当做请求出错处理(用于离线模式) YBCacheTypeReturnCacheDataExpireThenLoad///< 有缓存就用缓存,如果过期了就重新请求 没过期就不请求 }; //get请求 - (void)test_get { NSString *url = @"http://www.baidu.com"; NSDictionary *params = @{@"i":@"1"}; [YBHttpTool get:url params:params success:^(NSDictionary *obj) { //成功 } failure:^(NSError *error) { //失败 }]; } //get带缓存的请求 - (void)test_get_cache { NSString *url = @"http://www.baidu.com"; NSDictionary *params = @{@"i":@"1"}; [YBHttpTool get:url params:params cacheType:YBCacheTypeReturnCacheDataThenLoad success:^(NSDictionary *obj) { //成功 } failure:^(NSError *error) { //失败 }]; } //post请求带缓存 - (void)test_post_cache { NSString *url = @"http://www.baidu.com"; NSDictionary *params = @{@"i":@"1"}; [YBHttpTool post:url params:params cacheType:YBCacheTypeReturnCacheDataThenLoad success:^(NSDictionary *obj) { //成功 } failure:^(NSError *error) { //失败 }]; } //上传单张图片 - (void)test_upload_image { UIImage *image = [UIImage imageNamed:@"1"]; NSData *data = UIImageJPEGRepresentation(image, 0.5); [YBHttpTool uploadImageWithImage:data success:^(NSDictionary *obj) { //上传成功 } failure:^(NSError *error) { //上传失败 }]; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值