当前位置: 首页 > news >正文

AF3.1.0简单二次封装

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

#import <Foundation/Foundation.h>

@class AFNetworking;

@interface ZJLAFRequest : NSObject

+ (ZJLAFRequest *) sharedInstance;

/** get请求*/
- (void)GET:(NSString *)URLString dict:(id)dict progressFloat:(void (^)(float progressFloat))progressFloat succeed:(void (^) (id  responseObject))succeed failure:(void (^) (NSError *error))failure;

/** post请求*/
- (void)POST:(NSString *)URLString dict:(id)dict progressFloat:(void (^)(float progressFloat))progressFloat succeed:(void (^)(id responseObject))succeed failure:(void (^)(NSError *error))failure;

/** 下载文件*/
-(void)DOWNLOAD:(NSString *)URLString progressFloat:(void (^)(float progressFloat))progressFloat downLoadDic:(void (^)(id responseObject))downLoadDic;

/** 上传多张图片*/
-(void)UPLOAD:(NSString *)URLString dict:(id)dict imageArray:(id)imageArray progressFloat:(void (^)(float progressFloat))progressFloat succeed:(void (^) (id  responseObject))succeed failure:(void (^) (NSError *error))failure;

@end





#import "ZJLAFRequest.h"

@implementation ZJLAFRequest

/**
 *  创建网络请求类的单例
 */
static ZJLAFRequest *httpRequest = nil;
+ (ZJLAFRequest *)sharedInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (httpRequest == nil) {
            httpRequest = [[self alloc] init];
        }
    });
    return httpRequest;
}

+(instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (httpRequest == nil) {
            httpRequest = [super allocWithZone:zone];
        }
    });
    return httpRequest;
}

- (instancetype)copyWithZone:(NSZone *)zone
{
    return httpRequest;
}

/**
 *  GET请求
 *
 *  @param URLString 网络请求地址
 *  @param dict      参数(可以是字典或者nil)
 *  @param succeed   成功后执行success block
 *  @param failure   失败后执行failure block
 */
- (void)GET:(NSString *)URLString dict:(id)dict progressFloat:(void (^)(float progressFloat))progressFloat succeed:(void (^)(id responseObject))succeed failure:(void (^)(NSError *error))failure
{
    //创建网络请求管理对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //设置请求接口回来的时候支持什么类型的数据
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/xml",@"text/xml",@"text/html",nil];
    //发送网络请求(请求方式为GET)
    [manager GET:URLString parameters:dict progress:^(NSProgress * _Nonnull downloadProgress) {
        
        //下载进度
        float downloadPro = 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount;
        progressFloat(downloadPro);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        succeed(responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        failure(error);
        
    }];
}

/**
 *  POST请求
 *
 *  @param URLString 网络请求地址
 *  @param dict      参数(可以是字典或者nil)
 *  @param succeed   成功后执行success block
 *  @param failure   失败后执行failure block
 */
- (void)POST:(NSString *)URLString dict:(id)dict progressFloat:(void (^)(float progressFloat))progressFloat succeed:(void (^)(id responseObject))succeed failure:(void (^)(NSError *error))failure
{
    //创建网络请求管理对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //设置请求接口回来的时候支持什么类型的数据
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/xml",@"text/xml",@"text/html",nil];
    //发送网络请求(请求方式为POST)
    [manager POST:URLString parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) {
        
        //下载进度
        float downloadPro = 1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount;
        progressFloat(downloadPro);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        succeed(responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        failure(error);
        
    }];
}

/**
 *  下载文件
 *
 *  @param URLString     网络请求地址
 *  @param progressFloat 当前的下载进度
 *  @param downLoadDic   保存下载完成的状态和路径
 */
-(void)DOWNLOAD:(NSString *)URLString progressFloat:(void (^)(float progressFloat))progressFloat downLoadDic:(void (^)(id responseObject))downLoadDic
{
    //创建管理者对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]];
    //下载任务
    NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
        
        //下载进度
        float downloadPro = 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount;
        progressFloat(downloadPro);
        
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        
        //下载到哪个文件夹
        NSString *cachePath=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
        NSString *fileName=[cachePath stringByAppendingPathComponent:response.suggestedFilename];
        return [NSURL fileURLWithPath:fileName];
        
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

        //保存数据到字典
        NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
        if (error)
            [dictionary setObject:error forKey:@"error"];
        //将url转成字符串去掉开头的file:再保存到字典
        if ([filePath absoluteString])
        {
            NSString *filePathStr = [filePath absoluteString];
            if ([filePathStr hasPrefix:@"file:"]) {
                 filePathStr = [[filePath absoluteString] substringFromIndex:5];
            }
            [dictionary setObject:filePathStr forKey:@"filePath"];
        }

        //下载完成调用的方法
        downLoadDic(dictionary);
        
    }];
    
    //开始启动任务
    [task resume];
}

/**
 *  上传图片
 *
 *  @param URLString     网络请求地址
 *  @param dict          参数(可以是字典或者nil)
 *  @param imageArray    保存图片的数组
 *  @param progressFloat 当前的上传进度
 *  @param succeed       上传成功
 *  @param failure       上传失败
 */
-(void)UPLOAD:(NSString *)URLString dict:(id)dict imageArray:(id)imageArray progressFloat:(void (^)(float progressFloat))progressFloat succeed:(void (^) (id  responseObject))succeed failure:(void (^) (NSError *error))failure
{
    //创建管理者对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //设置请求接口回来的时候支持什么类型的数据
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/xml",@"text/xml",@"text/html",nil];
    
    [manager POST:URLString parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        
        //保证当前上传图片名字的唯一性,获取当前时间戳
        NSDate *  senddate=[NSDate date];
        NSDateFormatter  *dateformatter=[[NSDateFormatter alloc] init];
        [dateformatter setDateFormat:@"YYMMddHHmmss"];
        NSString *  locationString=[dateformatter stringFromDate:senddate];

        for (int i = 0; i < [(NSMutableArray *)imageArray count]; i ++) {
            //获取每一张图片转成data
            UIImage *image = imageArray[i];
            NSData *data = UIImageJPEGRepresentation(image, 0.7);
            //时间戳拼接当前的i得到图片的名字
            NSString *name = [locationString stringByAppendingString:[NSString stringWithFormat:@"%d",i]];
            //这个就是上传的参数
            [formData appendPartWithFileData:data name:name fileName:[NSString stringWithFormat:@"%@.jpg",name] mimeType:@"image/jpeg"];
        }
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        //打印下上传进度
        float downloadPro = 1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount;
        progressFloat(downloadPro);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        succeed(responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        failure(error);
        
    }];
}

@end

使用方法:

先导入头文件 #import "ZJLAFRequest.h"
以post请求为例子:

 NSString *hostString = @"xxxxx";
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"22",@"userid",nil];
    
    ZJLAFRequest *httpReauest = [ZJLAFRequest sharedInstance];
    [httpReauest POST:hostString dict:dic progressFloat:^(float progressFloat){
        
    }succeed:^(id responseObject) {
        
        //请求成功以后
        
    } failure:^(NSError *error) {
        
      //请求失败
        NSLog(@"%@", error);
        
    }];

 

转载于:https://my.oschina.net/linxiaoxi1993/blog/735928

相关文章:

  • Vue 项目中 根目录中router路由拦截 beforeEach 常用的写法
  • 不同按钮模板自定义
  • react项目中没有路由守卫,需要拦截的话,只能在路径上拦截,可以自己去封装 Route
  • 跟锦数学160823-190322, 共 942 题
  • JavaScript新鲜事·第5期
  • vue 项目实战 递归
  • react 项目 tab列表 把返回的一个字段数组,全部 展示在一个字段里
  • Python语言学习 (六)1.2
  • js语法中 ?. 和 ?? 的含义以及用法说明
  • 工作中MySql常用操作
  • 命令模式-对象行为型
  • git 分支 合并 具体执行过程 详细
  • 2017届校招提前批面试回顾
  • 前端 通过id 查询详情,让form表单中某地址展示成超链接,点击跳转并查看情况
  • 运用Keil uVision新建一个工程
  • Android框架之Volley
  • angular2开源库收集
  • co.js - 让异步代码同步化
  • CSS 三角实现
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • gf框架之分页模块(五) - 自定义分页
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JDK 6和JDK 7中的substring()方法
  • Mithril.js 入门介绍
  • MySQL的数据类型
  • Netty源码解析1-Buffer
  • React Transition Group -- Transition 组件
  • redis学习笔记(三):列表、集合、有序集合
  • spring-boot List转Page
  • SpringBoot 实战 (三) | 配置文件详解
  • SQLServer之索引简介
  • Vue UI框架库开发介绍
  • vue数据传递--我有特殊的实现技巧
  • Webpack 4x 之路 ( 四 )
  • 从零搭建Koa2 Server
  • 对象引论
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 删除表内多余的重复数据
  • 实习面试笔记
  • 使用 Docker 部署 Spring Boot项目
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 组复制官方翻译九、Group Replication Technical Details
  • ​第20课 在Android Native开发中加入新的C++类
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • !!java web学习笔记(一到五)
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • $.proxy和$.extend
  • (175)FPGA门控时钟技术
  • (C语言)逆序输出字符串
  • (NSDate) 时间 (time )比较
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)JPA - JQPL 实现增删改查
  • (已解决)vue+element-ui实现个人中心,仿照原神