由于AFNetworking底层请求由NSURLConnection更新为NSURLSession,管理者对象也由AFHTTPRequestOperationManager更新为AFURLSessionManager。

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

读者可以结合老版本AFHTTPRequestOperationManager的封装去理解,具体请参考:

iOS 【network-封装业务类AFNetworking(AFHTTPRequestOperationManager 废弃)】

代码描述:
① 封装业务类

1 //
2 //  WZYAFNTool.h
3 //  0716-02AFN上传下载GETPOST-01
4 //
5 //  Created by 王中尧 on 16/7/16.
6 //  Copyright © 2016年 wzy. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10 @class AFNetWorking;
11
12 @interface WZYAFNTool : NSObject
13
14 + (void)get:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure;
15
16 + (void)post:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure;
17
18 + (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;
19
20 + (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;
21
22 @end

 

 

1 //
2 //  WZYAFNTool.m
3 //  0716-02AFN上传下载GETPOST-01
4 //
5 //  Created by 王中尧 on 16/7/16.
6 //  Copyright © 2016年 wzy. All rights reserved.
7 //
8
9 #import “WZYAFNTool.h”
10 #import “AFNetworking.h”
11
12 @implementation WZYAFNTool
13
14 + (void)get:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure {
15
16     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
17
18     [manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
19
20         if (success) {
21             success(responseObject);
22         }
23
24     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
25
26         if (failure) {
27             failure(error);
28         }
29
30     }];
31 }
32
33 + (void)post:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure {
34
35     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
36
37     [manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
38
39         if (success) {
40             success(responseObject);
41         }
42
43     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
44
45         if (failure) {
46             failure(error);
47         }
48
49     }];
50 }
51
52 + (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 {
53
54     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
55
56     [manager POST:uploadUrl parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
57
58         /*
59          *个参数:要上传的文件的URL
60          第二个参数:后台接口规定
61          第三个参数:错误信息
62          */
63         [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:name error:nil];
64     } progress:^(NSProgress * _Nonnull uploadProgress) {
65
66         if (progress) {
67             progress(uploadProgress);
68         }
69
70     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
71
72         if (success) {
73             success(responseObject);
74         }
75
76     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
77
78         if (failure) {
79             failure(error);
80         }
81
82     }];
83 }
84
85 + (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 {
86     // 1 创建会话管理者
87     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
88
89     // 2 创建请求路径 请求对象
90     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
91
92     // 3 创建请求下载操作对象
93     NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
94
95         if (progress) {
96             progress(downloadProgress);
97         }
98
99     } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
100
101         if (destination) {
102             return  destination(targetPath, response);
103         } else {
104             return nil;
105         }
106     } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
107         if (failure) {
108             failure(response, filePath, error);
109         }
110     }];
111
112     // 4 执行任务发送下载操作请求
113     [downTask resume];
114 }
115
116 @end

 

② 调用

1 //
2 //  ViewController.m
3 //  0716-02AFN上传下载GETPOST-01
4 //
5 //  Created by 王中尧 on 16/7/16.
6 //  Copyright © 2016年 wzy. All rights reserved.
7 //
8
9 #import “ViewController.h”
10 #import “AFNetworking.h”
11
12 #import “WZYAFNTool.h”
13
14 @interface ViewController ()
15
16 @end
17
18 @implementation ViewController
19
20 – (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
21     // 使用AFN原生方法
22 //    [self getAFN];
23 //    [self postAFN];
24 //    [self upload];
25 //    [self download];
26
27     // 使用WZYAFNTool业务类
28 //    [self wzyGET];
29 //    [self wzyPOST];
30 //    [self wzyUpload];
31 //    [self wzyDownload];
32 }
33
34 // AFN GET请求
35 – (void)getAFN {
36
37     // 1 封装会话管理者
38     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
39
40     // 2 拼接请求参数
41     NSDictionary *dict = @{
42                            @”username” : @”xxx”,
43                            @”pwd” : @”xxx”,
44                            @”type” : @”JSON”
45                            };
46     // 3 发送请求
47     /*
48      *个参数:请求路径(!不包含参数) 类型是NSString
49      以前:http://120.25.226.186:32812/login?username=xxx&pwd=xxx&type=JSON
50      现在:http://120.25.226.186:32812/login
51      第二个参数:参数(用字典来保存参数)
52      第三个参数:progress 进度回调
53      第四个参数:success成功之后的回调
54      responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON—>OC,此处类型为id,也就是OC对象)
55      task.response:响应头
56      第五个参数:failure 失败之后的回调
57     */
58     [manager GET:@”http://120.25.226.186:32812/login” parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
59
60         NSLog(@”success—%@—%@”, responseObject, [responseObject class]);
61     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
62         NSLog(@”failure—%@”, error);
63     }];
64
65 }
66 // WZYAFNTool GET请求
67 – (void)wzyGET {
68     NSDictionary *dict = @{
69                            @”username” : @”xxx”,
70                            @”pwd” : @”xxx”,
71                            @”type” : @”JSON”
72                            };
73
74     [WZYAFNTool get:@”http://120.25.226.186:32812/login” parameters:dict success:^(id object) {
75         NSLog(@”success—%@”, object);
76     } failure:^(NSError *error) {
77         NSLog(@”error—%@”, error);
78     }];
79 }
80
81
82 // AFN POST请求
83 – (void)postAFN {
84     // 1 封装会话管理者
85     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
86
87     // 2 拼接请求参数
88     NSDictionary *dict = @{
89                            @”username” : @”xxx”,
90                            @”pwd” : @”xxx”,
91                            @”type” : @”JSON”
92                            };
93     // 3 发送请求
94     /*
95      *个参数:请求路径(!不包含参数) 类型是NSString
96      以前:http://120.25.226.186:32812/login?username=xxx&pwd=123&type=JSON
97      现在:http://120.25.226.186:32812/login
98      第二个参数:参数(用字典来保存参数)
99      第三个参数:progress 进度回调
100      第四个参数:success成功之后的回调
101      responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON—>OC,此处类型为id,也就是OC对象)
102      task.response:响应头
103      第五个参数:failure 失败之后的回调
104      */
105     [manager POST:@”http://120.25.226.186:32812/login” parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
106
107         NSLog(@”success—%@—%@”, responseObject, [responseObject class]);
108     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
109         NSLog(@”failure—%@”, error);
110     }];
111 }
112 // WZYAFNTool POST请求
113 – (void)wzyPOST {
114     NSDictionary *dict = @{
115                            @”username” : @”xxx”,
116                            @”pwd” : @”xxx”,
117                            @”type” : @”JSON”
118                            };
119     [WZYAFNTool post:@”http://120.25.226.186:33122/login” parameters:dict success:^(id object) {
120         NSLog(@”success—%@”, object);
121     } failure:^(NSError *error) {
122         NSLog(@”error—%@”, error);
123     }];
124 }
125
126
127 // AFN 上传
128 – (void)upload {
129     // 1 创建请求者对象
130     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
131
132     // 2 发送POST请求上传数据文件
133     NSDictionary *dict = @{@”wzy” : @”wangzhongyao”};
134
135     /*
136      *个参数: 请求路径
137      第二个参数: 非文件参数 (字典)
138      第三个参数: constructingBodyWithBlock 处理上传的文件
139      第四个参数: progress 进度回调
140      第五个参数: success 成功之后的回调
141      responseObject 响应体
142      第六个参数: failure 失败之后的回调
143      */
144
145     [manager POST:@”http://120.25.226.186:31112/upload” parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
146
147         /*
148          *个参数:要上传的文件的URL
149          第二个参数:后台接口规定
150          第三个参数:错误信息
151          */
152         [formData appendPartWithFileURL:[NSURL fileURLWithPath:@”/Users/wangzhongyao/Desktop/Snip20160716_17.png”] name:@”file” error:nil];
153     } progress:^(NSProgress * _Nonnull uploadProgress) {
154
155         // 上传进度
156         NSLog(@”unload — %f”, 1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
157
158     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
159
160         //JSON—>OC 反序列化
161         NSLog(@”响应体 — %@”,responseObject); // responseObject 响应体 在方法内部就反序列化成功
162     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
163
164         // 输出错误信息
165         NSLog(@”%@”, error);
166     }];
167 }
168 // WZYAFNTool 上传
169 – (void)wzyUpload {
170     NSDictionary *dict = @{@”wzy” : @”wangzhongyao”};
171
172     [WZYAFNTool unload:@”http://120.25.226.186:32812/upload” parameters:dict filePath:@”/Users/wangzhongyao/Desktop/Snip20160716_17.png” name:@”file” progress:^(NSProgress *progress) {
173
174         // 上传进度
175         NSLog(@”unload — %f”, 1.0 *progress.completedUnitCount / progress.totalUnitCount);
176     } success:^(id object) {
177
178         //JSON—>OC 反序列化
179         NSLog(@”响应体 — %@”,object); // responseObject 响应体 在方法内部就反序列化成功
180     } failure:^(NSError *error) {
181
182         // 输出错误信息
183         NSLog(@”%@”, error);
184     }];
185
186 }
187
188
189 // AFN 下载
190 – (void)download {
191
192     /*
193      *个参数: 请求对象
194      第二个参数: progress进度回调
195      第三个参数: destination URL处理的回调
196                targetPath:文件下载到沙盒中的临时路径
197                response:响应头信息
198      返回值: 告诉AFN文件应该剪切到什么地方
199      第四个参数: completionHandler完成之后的回调
200                filePath:就是文件的*终保存位置
201      */
202
203     // 1 创建会话管理者
204     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
205
206     // 2 创建请求路径 请求对象
207     NSURL *url = [NSURL URLWithString:@”http://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg”];
208     NSURLRequest *request = [NSURLRequest requestWithURL:url];
209
210     // 3 创建请求下载操作对象
211     NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
212
213         // 计算进度
214         NSLog(@”downloading — %f”, 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
215
216     } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
217
218         // 获得文件下载保存的全路径
219         NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
220         NSLog(@”fullPath — %@, tmpPath — %@”, fullPath, targetPath); // 打印需要修改的全路径 & 临时路径
221
222         // 该方法会拼接上协议头 file:// 成为一个完整的URL,而URLWithString不会自动拼接协议头
223         return [NSURL fileURLWithPath:fullPath]; // 该block是有返回值的,返回文件剪切保存的路径
224
225     } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
226         NSLog(@”filePath — %@”, filePath);
227     }];
228
229     // 4 执行任务发送下载操作请求
230     [downTask resume];
231 }
232 // WZYAFNTool 下载
233 – (void)wzyDownload {
234     [WZYAFNTool download:@”http://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg” progress:^(NSProgress *progress) {
235
236         // 计算进度
237         NSLog(@”downloading — %f”, 1.0 * progress.completedUnitCount / progress.totalUnitCount);
238
239     } destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
240
241         // 获得文件下载保存的全路径
242         NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
243         NSLog(@”fullPath — %@, tmpPath — %@”, fullPath, targetPath); // 打印需要修改的全路径 & 临时路径
244
245         // 该方法会拼接上协议头 file:// 成为一个完整的URL,而URLWithString不会自动拼接协议头
246         return [NSURL fileURLWithPath:fullPath];
247
248     } failure:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
249
250         NSLog(@”filePath — %@”, filePath); // filePath — (null)
251
252     }];
253 }
254
255 @end