• 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:@"
    " 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
  • 相关阅读:
    使用Dorado框架开发必备参考
    Dorado重用最佳实践
    css布局_web
    dorado学习笔记(二)
    Oracle归档日志删除
    给大家拜年啦!
    悟透JavaScript
    BCM57781网卡驱动下载地址
    win7安装jdk完后配置
    win7删除SVN保存的本地密码
  • 原文地址:https://www.cnblogs.com/xinjydeshow/p/5969334.html
Copyright © 2020-2023  润新知