AFN3.0封装
总结了一下AFN3.0封装,也借鉴了其他人总结的,整理如下,希望多交流,互相进步
//
// XJYSessionManager.h//
// Created by XJY on 16/10/17.
// Copyright © 2016年 XinJinYing. All rights reserved.
// #import <AFNetworking/AFNetworking.h> /**
* 宏定义请求成功的block
*
* @param responseObject 请求成功返回的数据
*/
typedef void(^XJYResponseSuccess)(NSURLSessionDataTask *task, id responseObject); /**
* 宏定义请求失败的block
*
* @param error 报错信息
*/
typedef void(^XJYResponseFail)(NSURLSessionDataTask *task, NSError *error); /**
* 上传或者下载的进度
*
* @param progress 进度
*/
typedef void(^XJYProgress)(NSProgress *progress); @interface XJYSessionManager : AFHTTPSessionManager //单例
+ (XJYSessionManager *)shareInstance; /**
* 普通get方法请求网络数据
*
* @param url 请求网址路径
* @param params 请求参数
* @param success 成功回调
* @param fail 失败回调
*/
+ (void)GET:(NSString *)url params:(NSDictionary *)params success:(XJYResponseSuccess)success fail:(XJYResponseFail)fail; //判断网络状态
+ (XJYSessionManager *)haveNetWork; /**
* 普通post方法请求网络数据
*
* @param url 请求网址路径
* @param params 请求参数
* @param success 成功回调
* @param fail 失败回调
*/
+ (void)POST:(NSString *)url params:(NSDictionary *)params success:(XJYResponseSuccess)success fail:(XJYResponseFail)fail; /**
* 普通路径上传文件
*
* @param url 请求网址路径
* @param params 请求参数
* @param filedata 文件
* @param name 指定参数名
* @param fileName 文件名(要有后缀名)
* @param mimeType 文件类型
* @param progress 上传进度
* @param success 成功回调
* @param fail 失败回调
*/ + (void)uploadWithURL:(NSString *)url
params:(NSDictionary *)params
fileData:(NSData *)filedata
name:(NSString *)name
fileName:(NSString *)fileName
mimeType:(NSString *)mimeType
progress:(XJYProgress)progress
success:(XJYResponseSuccess)success
fail:(XJYResponseFail)fail; /**
* 下载文件
*
* @param url 请求网络路径
* @param fileURL 保存文件url
* @param progress 下载进度
* @param success 成功回调
* @param fail 失败回调
*
* @return 返回NSURLSessionDownloadTask实例,可用于暂停继续,暂停调用suspend方法,重新开启下载调用resume方法
*/
+ (NSURLSessionDownloadTask *)downloadWithURL:(NSString *)url savePathURL:(NSURL *)fileURL progress:(XJYProgress)progress success:(void (^)(NSURLResponse *, NSURL *))success fail:(void (^)(NSError *))fail; @end
//
// XJYSessionManager.m//
// Created by XJY on 16/10/17.
// Copyright © 2016年 XinJinYing. All rights reserved.
// #import "XJYSessionManager.h" static int const DEFAULT_REQUEST_TIME_OUT = ; @implementation XJYSessionManager #pragma mark - 实例化Manager
static XJYSessionManager *shareInstance = nil;
+ (XJYSessionManager *)shareInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareInstance = [[self alloc] init];
});
return shareInstance;
} + (id)allocWithZone:(struct _NSZone *)zone
{
if (shareInstance == nil) {
shareInstance = [super allocWithZone:zone];
}
return shareInstance;
} - (id)copyWithZone:(NSZone *)zone
{
return shareInstance;
} - (instancetype)init
{
self = [super init];
if (self) {
//初始化一些参数
self.responseSerializer = [AFJSONResponseSerializer serializer];
self.requestSerializer = [AFJSONRequestSerializer serializer];
self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/html", @"text/json", @"text/javascript",@"application/x-javascript",@"text/plain",@"image/gif",nil];
self.reachabilityManager = [AFNetworkReachabilityManager sharedManager];
[[self requestSerializer] setTimeoutInterval:DEFAULT_REQUEST_TIME_OUT];
}
return self;
} #pragma mark - 判断使用什么网络
+ (XJYSessionManager *)haveNetWork
{
static NSString *const stringURL = @"https://www.baidu.com/";
NSURL *baseURL = [NSURL URLWithString:stringURL];
XJYSessionManager *manager = [[XJYSessionManager alloc] initWithBaseURL:baseURL];
NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"WWAN");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
{
NSLog(@"WiFi");
[operationQueue setSuspended:NO];
}
break;
case AFNetworkReachabilityStatusNotReachable:
{
NSLog(@"无网络");
if (kPLIOS7) {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"亲,您没网啦" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:alertAction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil]; } else {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"亲,您没网啦" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
[alertView show];
} }
default:
[operationQueue setSuspended:YES];
break;
}
}];
//开始监控
[manager.reachabilityManager startMonitoring];
return manager;
} #pragma mark - 解析数据
+ (id)responseConfiguration:(id)responseObject
{
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""];
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
return dic;
} #pragma mark - GET
+ (void)GET:(NSString *)url params:(NSDictionary *)params success:(XJYResponseSuccess)success fail:(XJYResponseFail)fail
{
AFHTTPSessionManager *manager = [XJYSessionManager shareInstance];
[manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
id dic = [XJYSessionManager responseConfiguration:responseObject];
success(task, dic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
fail(task, error);
}];
} #pragma mark - POST
+ (void)POST:(NSString *)url params:(NSDictionary *)params success:(XJYResponseSuccess)success fail:(XJYResponseFail)fail
{
AFHTTPSessionManager *manager = [XJYSessionManager shareInstance];
[manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
id dic = [XJYSessionManager responseConfiguration:responseObject];
success(task, dic);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
fail(task, error);
}];
} #pragma mark - 上传
+ (void)uploadWithURL:(NSString *)url params:(NSDictionary *)params fileData:(NSData *)filedata name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType progress:(XJYProgress)progress success:(XJYResponseSuccess)success fail:(XJYResponseFail)fail
{
AFHTTPSessionManager *manager = [XJYSessionManager shareInstance];
[manager POST:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
[formData appendPartWithFileData:filedata name:name fileName:fileName mimeType:mimeType];
} progress:^(NSProgress * _Nonnull uploadProgress) { progress(uploadProgress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { id dic = [XJYSessionManager responseConfiguration:responseObject];
success(task, dic); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
fail(task, error);
}];
} #pragma mark - 下载
+ (NSURLSessionDownloadTask *)downloadWithURL:(NSString *)url savePathURL:(NSURL *)fileURL progress:(XJYProgress)progress success:(void (^)(NSURLResponse *, NSURL *))success fail:(void (^)(NSError *))fail
{
AFHTTPSessionManager *manager = [XJYSessionManager shareInstance]; NSURL *urlPath = [NSURL URLWithString:url];
NSURLRequest *request = [NSURLRequest requestWithURL:urlPath];
NSURLSessionDownloadTask *downLoadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { progress(downloadProgress); } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//下载后保存的路径
return [fileURL URLByAppendingPathComponent:[response suggestedFilename]]; } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { if (error) {
fail(error);
} else {
success(response, filePath);
} }]; [downLoadTask resume];
return downLoadTask; }
@end
AFN3.0封装的更多相关文章
- 第六十二篇、AFN3.0封装网络请求框架,支持缓存
1.网络请求 第一种实现方式: 功能:GET POST 请求 缓存逻辑: 1.是否要刷新本地缓存,不需要就直接发起无缓存的网络请求,否则直接读取本地数据 2.需要刷新本地缓存,先读取本地数据,有就返回 ...
- 基于NET 6.0 封装的 Fast.Framework
Fast Framework 项目地址 https://gitee.com/China-Mr-zhong/Fast.Framework Author Mr-zhong Wechat 850856667 ...
- 基于AFNetWorking 3.0封装网络请求数据的类
对于使用 AFNetworking 的朋友来说,很多朋友都是直接调用 AFNetworking的 API ,这样不太好,无法做到全工程统一配置. 最好的方式就是对网络层再封装一层,全工程不允许直接使用 ...
- LXNetwork – 基于AF3.0封装的iOS网络请求库
本框架实现思路与YTKNetwork和RTNetworking类似,相当于一个简单版,把每一个网络请求封装成对象.使用LXNetwork,你的每一个请求都需要继承LXBaseRequest类,通过覆盖 ...
- Swift 2.0 封装图片折叠效果
文/猫爪(简书作者)原文链接:http://www.jianshu.com/p/688c491580e3著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 用Swift封装图片折叠效果 b ...
- 【转】Vue 2.0封装axios笔记
前言 单页面应用大多采用前后端分离开发思路,我们知道,前端和后端交互有多中方式(服务器端渲染.Ajax.websocket等),今天我们主要讲解Ajax部分. 最近团队讨论了一下,Ajax 本身跟 V ...
- Struts2.0 封装请求数据和拦截器介绍
1. Struts2 框架中使用 Servlet 的 API 来操作数据 1.1 完全解耦合的方式 Struts2 框架中提供了一个 ActionContext 类,该类中提供了一些方法: stati ...
- iOS-网络请求-AFN升级至AFN3.0
AFNetworking是一款在OS X和iOS下都令人喜爱的网络库.为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持. ...
- 分享一个基于EF5.0封装的BaseDAL
public class BaseDAL<T> where T : class,new() { protected DbContext dbContext = DbContextFacto ...
随机推荐
- Netbeans配置Xdebug
1.进入 http://xdebug.org/wizard.php 页面,新建一个php页面,里面输入 echo phpinfo(); 然后在运行的页面,复制页面内容到里面, 这个网站会分析出,当前运 ...
- Javascript中关键参数this浅析
自从接触javascript以来,对this参数的理解一直是模棱两可.虽有过深入去理解,但却也总感觉是那种浮于表面,没有完全理清头绪. 但对于this参数,确实会让人产生很多误解.那么this参数到底 ...
- 优化javaScript代码,提高执行效率
今天看完书,总结了一下可以如何优化 JavaScript . 1.合并js文件 为优化性能,可以把多个js文件(css文件也可以)合并成极少数大文件.跟十个5k的js文件相比,合并成一个50k的文件更 ...
- 使用 CSS3 实现超炫的 Loading(加载)动画效果
SpinKit 是一套网页动画效果,包含8种基于 CSS3 实现的很炫的加载动画.借助 CSS3 Animation 的强大功能来创建平滑,易于定制的动画.SpinKit 的目标不是提供一个每个浏览器 ...
- WebApi Controller 分类
前言 写这篇WebApi Controller分类一是把Contrller分类的解决方法说一说,再顺便把遇到的问题和解决方法聊一聊. 说实话第一次在项目中使用WebApi感觉非常的不顺手. 遇到的问题 ...
- 【Android】[转] Android屏幕旋转使用OrientationEventListener的监听
说明 遇到一个奇葩的问题,我在使用onConfigChanged拦截屏幕的横竖屏旋转时,发现直接进行180度的横屏/竖屏转换居然没有反应!查找原因发现仅对landscape或者portrait状态有用 ...
- SQL之收集SQL Server线程等待信息
要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...
- ActiveX(一)第一个简单的Demo
说道ActiveX,我的第一直觉就是Flash,利用ActiveX.我们可以创建丰富的可交互式应用程序.同时.利用ActiveX特性.我们可以实现Js 与 ActiveX 的无缝连接(包括数据共享.和 ...
- 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换
[源码下载] 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换 作者:webabcd 介绍速战速决 之 PHP ...
- js动态的把左边列表添加到右边,可删除。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...