欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS 【network-封装业务类AFNetworking(AFHTTPSessionManager)】

程序员文章站 2022-09-04 17:24:12
由于afnetworking底层请求由nsurlconnection更新为nsurlsession,管理者对象也由afhttprequestoperationmanager更新为afurlsessi...

由于afnetworking底层请求由nsurlconnection更新为nsurlsession,管理者对象也由afhttprequestoperationmanager更新为afurlsessionmanager。

本文重点讲述如何封装afn业务类,将第三方为程序带来的污染减小到最低。

 

代码描述:

① 封装业务类

//
//  wzyafntool.h
//  0716-02afn上传下载getpost-01
//
//  created by 王中尧 on 16/7/16.
//  copyright © 2016年 wzy. all rights reserved.
//

#import 
@class afnetworking;

@interface wzyafntool : nsobject

+ (void)get:(nsstring *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(nserror *error))failure;

+ (void)post:(nsstring *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(nserror *error))failure;

+ (void)unload:(nsstring *)uploadurl parameters:(id)params filepath:(nsstring *)filepath name:(nsstring *)name progress:(void (^)(nsprogress *))progress success:(void (^)(id object))success failure:(void (^)(nserror *))failure;

+ (void)download:(nsstring *)url progress:(void (^)(nsprogress *progress))progress destination:(nsurl *(^)(nsurl *targetpath, nsurlresponse *response))destination failure:(void (^)(nsurlresponse * response, nsurl * filepath, nserror * error))failure;

@end

//
//  wzyafntool.m
//  0716-02afn上传下载getpost-01
//
//  created by 王中尧 on 16/7/16.
//  copyright © 2016年 wzy. all rights reserved.
//

#import "wzyafntool.h"
#import "afnetworking.h"

@implementation wzyafntool

+ (void)get:(nsstring *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(nserror *error))failure {
    
    afhttpsessionmanager *manager = [afhttpsessionmanager manager];
    
    [manager get:url parameters:params progress:nil success:^(nsurlsessiondatatask * _nonnull task, id  _nullable responseobject) {
        
        if (success) {
            success(responseobject);
        }
        
    } failure:^(nsurlsessiondatatask * _nullable task, nserror * _nonnull error) {
       
        if (failure) {
            failure(error);
        }
        
    }];
}

+ (void)post:(nsstring *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(nserror *error))failure {
    
    afhttpsessionmanager *manager = [afhttpsessionmanager manager];
    
    [manager get:url parameters:params progress:nil success:^(nsurlsessiondatatask * _nonnull task, id  _nullable responseobject) {
        
        if (success) {
            success(responseobject);
        }
        
    } failure:^(nsurlsessiondatatask * _nullable task, nserror * _nonnull error) {
        
        if (failure) {
            failure(error);
        }
        
    }];
}

+ (void)unload:(nsstring *)uploadurl parameters:(id)params filepath:(nsstring *)filepath name:(nsstring *)name progress:(void (^)(nsprogress *progress))progress success:(void (^)(id object))success failure:(void (^)(nserror *error))failure {
    
    afhttpsessionmanager *manager = [afhttpsessionmanager manager];

    [manager post:uploadurl parameters:params constructingbodywithblock:^(id  _nonnull formdata) {
        
        /*
         第一个参数:要上传的文件的url
         第二个参数:后台接口规定
         第三个参数:错误信息
         */
        [formdata appendpartwithfileurl:[nsurl fileurlwithpath:filepath] name:name error:nil];
    } progress:^(nsprogress * _nonnull uploadprogress) {
        
        if (progress) {
            progress(uploadprogress);
        }
        
    } success:^(nsurlsessiondatatask * _nonnull task, id  _nullable responseobject) {
        
        if (success) {
            success(responseobject);
        }
        
    } failure:^(nsurlsessiondatatask * _nullable task, nserror * _nonnull error) {
        
        if (failure) {
            failure(error);
        }
        
    }];
}

+ (void)download:(nsstring *)url progress:(void (^)(nsprogress *progress))progress destination:(nsurl *(^)(nsurl *targetpath, nsurlresponse *response))destination failure:(void (^)(nsurlresponse * response, nsurl * filepath, nserror * error))failure {
    // 1 创建会话管理者
    afhttpsessionmanager *manager = [afhttpsessionmanager manager];
    
    // 2 创建请求路径 请求对象
    nsurlrequest *request = [nsurlrequest requestwithurl:[nsurl urlwithstring:url]];
    
    // 3 创建请求下载操作对象
    nsurlsessiondownloadtask *downtask = [manager downloadtaskwithrequest:request progress:^(nsprogress * _nonnull downloadprogress) {
        
        if (progress) {
            progress(downloadprogress);
        }
        
    } destination:^nsurl * _nonnull(nsurl * _nonnull targetpath, nsurlresponse * _nonnull response) {
        
        if (destination) {
            return  destination(targetpath, response);
        } else {
            return nil;
        }
    } completionhandler:^(nsurlresponse * _nonnull response, nsurl * _nullable filepath, nserror * _nullable error) {
        if (failure) {
            failure(response, filepath, error);
        }
    }];
    
    // 4 执行任务发送下载操作请求
    [downtask resume];
}

@end

 

② 调用

 

//
//  viewcontroller.m
//  0716-02afn上传下载getpost-01
//
//  created by 王中尧 on 16/7/16.
//  copyright © 2016年 wzy. all rights reserved.
//

#import "viewcontroller.h"
#import "afnetworking.h"

#import "wzyafntool.h"

@interface viewcontroller ()

@end

@implementation viewcontroller

- (void)touchesbegan:(nsset *)touches withevent:(uievent *)event {
    // 使用afn原生方法
//    [self getafn];
//    [self postafn];
//    [self upload];
//    [self download];
    
    // 使用wzyafntool业务类
//    [self wzyget];
//    [self wzypost];
//    [self wzyupload];
//    [self wzydownload];
}

// afn get请求
- (void)getafn {
    
    // 1 封装会话管理者
    afhttpsessionmanager *manager = [afhttpsessionmanager manager];
    
    // 2 拼接请求参数
    nsdictionary *dict = @{
                           @"username" : @"520it",
                           @"pwd" : @"520it",
                           @"type" : @"json"
                           };
    // 3 发送请求
    /*
     第一个参数:请求路径(!不包含参数) 类型是nsstring
     以前:https://120.25.226.186:32812/login?username=520it&pwd=123&type=json
     现在:https://120.25.226.186:32812/login
     第二个参数:参数(用字典来保存参数)
     第三个参数:progress 进度回调
     第四个参数:success成功之后的回调
     responseobject:注意此参数是响应体(内部已经完成了反序列化处理:json--->oc,此处类型为id,也就是oc对象)
     task.response:响应头
     第五个参数:failure 失败之后的回调
    */
    [manager get:@"https://120.25.226.186:32812/login" parameters:dict progress:nil success:^(nsurlsessiondatatask * _nonnull task, id  _nullable responseobject) {
        
        nslog(@"success---%@---%@", responseobject, [responseobject class]);
    } failure:^(nsurlsessiondatatask * _nullable task, nserror * _nonnull error) {
        nslog(@"failure---%@", error);
    }];
    
}
// wzyafntool get请求
- (void)wzyget {
    nsdictionary *dict = @{
                           @"username" : @"520it",
                           @"pwd" : @"520it",
                           @"type" : @"json"
                           };
    
    [wzyafntool get:@"https://120.25.226.186:32812/login" parameters:dict success:^(id object) {
        nslog(@"success---%@", object);
    } failure:^(nserror *error) {
        nslog(@"error---%@", error);
    }];
}


// afn post请求
- (void)postafn {
    // 1 封装会话管理者
    afhttpsessionmanager *manager = [afhttpsessionmanager manager];
    
    // 2 拼接请求参数
    nsdictionary *dict = @{
                           @"username" : @"520it",
                           @"pwd" : @"520it",
                           @"type" : @"json"
                           };
    // 3 发送请求
    /*
     第一个参数:请求路径(!不包含参数) 类型是nsstring
     以前:https://120.25.226.186:32812/login?username=520it&pwd=123&type=json
     现在:https://120.25.226.186:32812/login
     第二个参数:参数(用字典来保存参数)
     第三个参数:progress 进度回调
     第四个参数:success成功之后的回调
     responseobject:注意此参数是响应体(内部已经完成了反序列化处理:json--->oc,此处类型为id,也就是oc对象)
     task.response:响应头
     第五个参数:failure 失败之后的回调
     */
    [manager post:@"https://120.25.226.186:32812/login" parameters:dict progress:nil success:^(nsurlsessiondatatask * _nonnull task, id  _nullable responseobject) {
        
        nslog(@"success---%@---%@", responseobject, [responseobject class]);
    } failure:^(nsurlsessiondatatask * _nullable task, nserror * _nonnull error) {
        nslog(@"failure---%@", error);
    }];
}
// wzyafntool post请求
- (void)wzypost {
    nsdictionary *dict = @{
                           @"username" : @"520it",
                           @"pwd" : @"520it",
                           @"type" : @"json"
                           };
    [wzyafntool post:@"https://120.25.226.186:32812/login" parameters:dict success:^(id object) {
        nslog(@"success---%@", object);
    } failure:^(nserror *error) {
        nslog(@"error---%@", error);
    }];
}


// afn 上传
- (void)upload {
    // 1 创建请求者对象
    afhttpsessionmanager *manager = [afhttpsessionmanager manager];
    
    // 2 发送post请求上传数据文件
    nsdictionary *dict = @{@"wzy" : @"wangzhongyao"};
    
    /*
     第一个参数: 请求路径
     第二个参数: 非文件参数 (字典)
     第三个参数: constructingbodywithblock 处理上传的文件
     第四个参数: progress 进度回调
     第五个参数: success 成功之后的回调
     responseobject 响应体
     第六个参数: failure 失败之后的回调
     */
    
    [manager post:@"https://120.25.226.186:32812/upload" parameters:dict constructingbodywithblock:^(id  _nonnull formdata) {
        
        /*
         第一个参数:要上传的文件的url
         第二个参数:后台接口规定
         第三个参数:错误信息
         */
        [formdata appendpartwithfileurl:[nsurl fileurlwithpath:@"/users/wangzhongyao/desktop/snip20160716_17.png"] name:@"file" error:nil];
    } progress:^(nsprogress * _nonnull uploadprogress) {
        
        // 上传进度
        nslog(@"unload --- %f", 1.0 *uploadprogress.completedunitcount / uploadprogress.totalunitcount);
        
    } success:^(nsurlsessiondatatask * _nonnull task, id  _nullable responseobject) {
        
        //json--->oc 反序列化
        nslog(@"响应体 --- %@",responseobject); // responseobject 响应体 在方法内部就反序列化成功
    } failure:^(nsurlsessiondatatask * _nullable task, nserror * _nonnull error) {
        
        // 输出错误信息
        nslog(@"%@", error);
    }];
}
// wzyafntool 上传
- (void)wzyupload {
    nsdictionary *dict = @{@"wzy" : @"wangzhongyao"};
    
    [wzyafntool unload:@"https://120.25.226.186:32812/upload" parameters:dict filepath:@"/users/wangzhongyao/desktop/snip20160716_17.png" name:@"file" progress:^(nsprogress *progress) {
        
        // 上传进度
        nslog(@"unload --- %f", 1.0 *progress.completedunitcount / progress.totalunitcount);
    } success:^(id object) {
        
        //json--->oc 反序列化
        nslog(@"响应体 --- %@",object); // responseobject 响应体 在方法内部就反序列化成功
    } failure:^(nserror *error) {
        
        // 输出错误信息
        nslog(@"%@", error);
    }];
    
}


// afn 下载
- (void)download {
    
    /*
     第一个参数: 请求对象
     第二个参数: progress进度回调
     第三个参数: destination url处理的回调
               targetpath:文件下载到沙盒中的临时路径
               response:响应头信息
     返回值: 告诉afn文件应该剪切到什么地方
     第四个参数: completionhandler完成之后的回调
               filepath:就是文件的最终保存位置
     */
    
    // 1 创建会话管理者
    afhttpsessionmanager *manager = [afhttpsessionmanager manager];
    
    // 2 创建请求路径 请求对象
    nsurl *url = [nsurl urlwithstring:@"https://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg"];
    nsurlrequest *request = [nsurlrequest requestwithurl:url];
   
    // 3 创建请求下载操作对象
    nsurlsessiondownloadtask *downtask = [manager downloadtaskwithrequest:request progress:^(nsprogress * _nonnull downloadprogress) {
        
        // 计算进度
        nslog(@"downloading --- %f", 1.0 * downloadprogress.completedunitcount / downloadprogress.totalunitcount);
        
    } destination:^nsurl * _nonnull(nsurl * _nonnull targetpath, nsurlresponse * _nonnull response) {
        
        // 获得文件下载保存的全路径
        nsstring *fullpath = [[nssearchpathfordirectoriesindomains(nscachesdirectory, nsuserdomainmask, yes) lastobject] stringbyappendingpathcomponent:response.suggestedfilename];
        nslog(@"fullpath --- %@, tmppath --- %@", fullpath, targetpath); // 打印需要修改的全路径 & 临时路径
        
        // 该方法会拼接上协议头 file:// 成为一个完整的url,而urlwithstring不会自动拼接协议头
        return [nsurl fileurlwithpath:fullpath]; // 该block是有返回值的,返回文件剪切保存的路径
        
    } completionhandler:^(nsurlresponse * _nonnull response, nsurl * _nullable filepath, nserror * _nullable error) {
        nslog(@"filepath --- %@", filepath);
    }];
    
    // 4 执行任务发送下载操作请求
    [downtask resume];
}
// wzyafntool 下载
- (void)wzydownload {
    [wzyafntool download:@"https://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg" progress:^(nsprogress *progress) {
        
        // 计算进度
        nslog(@"downloading --- %f", 1.0 * progress.completedunitcount / progress.totalunitcount);
        
    } destination:^nsurl *(nsurl *targetpath, nsurlresponse *response) {
        
        // 获得文件下载保存的全路径
        nsstring *fullpath = [[nssearchpathfordirectoriesindomains(nscachesdirectory, nsuserdomainmask, yes) lastobject] stringbyappendingpathcomponent:response.suggestedfilename];
        nslog(@"fullpath --- %@, tmppath --- %@", fullpath, targetpath); // 打印需要修改的全路径 & 临时路径
        
        // 该方法会拼接上协议头 file:// 成为一个完整的url,而urlwithstring不会自动拼接协议头
        return [nsurl fileurlwithpath:fullpath];
        
    } failure:^(nsurlresponse *response, nsurl *filepath, nserror *error) {
        
        nslog(@"filepath --- %@", filepath); // filepath --- (null)
        
    }];
}

@end