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 = 20;

@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
时间: 2024-10-08 12:24:57

AFN3.0封装的相关文章

as3.0 封装一个可垂直居中及左右居中的label,并可以设置其字体样式

下面是封装了一个可设置垂直居中及左右居中的Label,同时可以设置label中的字体样式.代码如下: package myComponent  { import flash.display.Shape; import flash.display.Sprite; import flash.text.StyleSheet; import flash.text.TextField; import flash.text.TextLineMetrics; /**  * ...  * @author lia

LXNetwork – 基于AF3.0封装的iOS网络请求库

本框架实现思路与YTKNetwork和RTNetworking类似,相当于一个简单版,把每一个网络请求封装成对象.使用LXNetwork,你的每一个请求都需要继承LXBaseRequest类,通过覆盖父类的一些方法或者实现相关协议方法来构造指定的网络请求.这个网络库可直接在项目中使用,但是有些功能完成度不是很完美,待完善. GitHud地址:https://github.com/CoderLXWang/LXNetwork 一.为什么要这样做? 实现思路的图在下面,可以对比着图看下面内容. 直接封

vue2.0封装自己的ajax模块

最近在完成公司项目,技术栈为vue2.0+vux+vuex+webpack+echarts...另外还有vue-router及vue-loader(webpack下loader插件 可以把.vue文件 输出成组件). 考虑将ajax封装,目的有两个: 1.页面内写法简单,格式和国网平台格式一致,后期无需再更改代码 2.复用性 3.域名,端口等信息可以实现统一管理. 首先,先在components模块内定义自己的ajax,此处使用install方法,目的是可以在main.js中使用vue.use(

Swift3.0封装 AFN 的 GET&amp;POST网络请求

// // PSNetWorkManage.swift // WeiBoSwift // // Created by 思 彭 on 16/9/25. // Copyright © 2016年 思 彭. All rights reserved. // import UIKit import AFNetworking // Swift的枚举支持任意数据类型,不需要,分隔 enum PSHTTPMethod{ case GET case POST } /// 网络管理工具 class PSNetWor

iOS AFNetworking 3.0以上使用

在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的更新的新的版本--AFN 3.0版本.新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封装的AFHTTPSessionManager了. 下面将详细介绍AFN3.0的使用 1.cocoapods导入AFN 3.0 1.1 进入到工程目录下

AFNetWorking3.0使用 自签名证书的https请求

前几日,项目组出于安全角度的考虑,要求项目中的请求使用https请求,因为是企业内部使用的app,因此使用了自签名的证书,而自签名的证书是不受信任的,所以我们就需要自己来做证书的验证,包括服务器验证客户端的证书和我们要信任服务器的证书,SSL双向认证的原理我这里就不赘述了,这里提供两篇博客 iOS安全系列之一:HTTPS: http://oncenote.com/2014/10/21/Security-1-HTTPS/ iOS安全系列之二:HTTPS进阶: http://oncenote.com

iOS开发 AFNetworking 3.0使用遇到的问题

前段时间写了一个iOS开发之AFNetworking 3.0.4使用这篇文章,是基本的用法,昨天在使用的时候又出现了几个问题,特地俩记录下,希望能帮到大家! 问题一 我是做一个获取手机验证码的功能,进行一个网络请求,验证码也发给我了,后台的也跟我说请求成功了,但是我这边打印信息显示直接进入了错误的回调...如下图: 验证码获取返回格式问题 报错说是返回类型不一致,后来查明原因,是返回的格式问题(虽然后台跟我说返回的json)需要添加上这么一句话: //如果报接受类型不一致请替换一致text/ht

AFNetworking的封装

AFNetworking的封装 特点 1.将AFNetworking 3.0封装.能够很好享受苹果开发中的面向对象开发思想 . 2.其中也提供几种方法,来请求数据.包括:GET请求/POST请求/Upload请求. 3.调用的方法,在下面详细说明 使用方法 1.导入AFNetworking 文件夹 ,UIkit+AFNetworking 文件夹,Networking.h/.m 文件, UploadImageInformationObject.h/.m 文件(前两个是官方AFNetworking

iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载

0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目 •2. 或使用Cocopod 导入AFNetworking3.0+ •3.  引入 #import "AFNetworking.h" ----> 1.UI准备工作 A. 定义一个全局的 NSURLSessionDownloadTask:下载管理句柄    由其负责所有的网络操作请求 1 2 3 4 5 @interface ViewController () {     // 下载句柄     N