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

来源:互联网 发布:js 深拷贝 循环引用 编辑:程序博客网 时间:2024/05/25 05:35

http://www.2cto.com/kf/201607/527908.html

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

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

 

代码描述:

① 封装业务类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//
//  WZYAFNTool.h
//  0716-02AFN上传下载GETPOST-01
//
//  Created by 王中尧 on 16/7/16.
//  Copyright © 2016年 wzy. All rights reserved.
//
 
#import<foundation foundation.h="">
@classAFNetWorking;
 
@interfaceWZYAFNTool : 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
</foundation>

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//
//  WZYAFNTool.m
//  0716-02AFN上传下载GETPOST-01
//
//  Created by 王中尧 on 16/7/16.
//  Copyright © 2016年 wzy. All rights reserved.
//
 
#import"WZYAFNTool.h"
#import"AFNetworking.h"
 
@implementationWZYAFNTool
 
+ (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{
            returnnil;
        }
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        if(failure) {
            failure(response, filePath, error);
        }
    }];
     
    // 4 执行任务发送下载操作请求
    [downTask resume];
}
 
@end
</afmultipartformdata>

 

② 调用

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
//
//  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"
 
@interfaceViewController ()
 
@end
 
@implementationViewController
 
- (void)touchesBegan:(NSSet<uitouch> *)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
     以前:http://120.25.226.186:32812/login?username=520it&pwd=123&type=JSON
     现在:http://120.25.226.186:32812/login
     第二个参数:参数(用字典来保存参数)
     第三个参数:progress 进度回调
     第四个参数:success成功之后的回调
     responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON--->OC,此处类型为id,也就是OC对象)
     task.response:响应头
     第五个参数:failure 失败之后的回调
    */
    [manager GET:@"http://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:@"http://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
     以前:http://120.25.226.186:32812/login?username=520it&pwd=123&type=JSON
     现在:http://120.25.226.186:32812/login
     第二个参数:参数(用字典来保存参数)
     第三个参数:progress 进度回调
     第四个参数:success成功之后的回调
     responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON--->OC,此处类型为id,也就是OC对象)
     task.response:响应头
     第五个参数:failure 失败之后的回调
     */
    [manager POST:@"http://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:@"http://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:@"http://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:@"http://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:@"http://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:@"http://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</afmultipartformdata></uitouch>

0 0
原创粉丝点击