前面说了一下官方给的网络请求API,有很多东西还是需要自己来处理的。今天说一说AFNetworking,AFNetworking是一个三方网络请求库。如果大家看看源码会发现,它把官方给的API封装了一下,提供一个更方便的接口供大家使用。
- 封装请求对象类
- 创建会话类型
- 创建单个请求
- 创建多个请求
- 使用封装好的类
- 总结
封装请求对象类
创建一个APPRequest类,它包含三个属性:请求地址、请求参数、完成后的回调
typedef void (^DatatHandler)(id _Nullable responseObject); @interface APPRequest : NSObject@property (nonatomic, strong, nullable) NSString *URLString; @property (nonatomic, assign, nullable) id parameters; @property (nonatomic, copy, nullable) DatatHandler dataHandler; @end
创建会话类型
AFNetworking 核型功能是由AFURLSessionManager完成,AFHTTPSessionManager是对HTTP请求的一次封装。下面就用AFHTTPSessionManager创建一个会话对象
- (AFHTTPSessionManager*)sessionManager{ if (!_sessionManager) { _sessionManager = [AFHTTPSessionManager manager]; _sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer]; _sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; } return _sessionManager;}
创建单个请求
接下来实现单个请求方法;
/** * 单个请求方法,给定请求对象,创建请求任务。 * @param (APPRequest* _Nullable)request */- (void)SingleRequest:(APPRequest* _Nullable)request{ [[self sessionManager] POST:request.URLString parameters:request.parameters progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { request.dataHandler ? request.dataHandler(responseObject) : nil; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { request.dataHandler ? request.dataHandler(nil) : nil; }];}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
创建多个请求
既然有有了单个请求,为什么还会有多个请求呢?这个是考虑到服务器可能会提供多个接口=返回数据给客户端,而客户端收到数据后刷新一次UI界面就能搞定所有的界面更新,不需要一个接口刷新一次,导致大量调用绘制UI的API,影响性能。因此封装一个多个请求对象的方法。
- (void)MultipleRequests:(NSArray* _Nullable)requests{ __block NSUInteger count = [requests count]; NSMutableArray *errorArray = [NSMutableArray array]; for (APPRequest *request in requests) { [[self sessionManager] POST:request.URLString parameters:request.parameters progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { request.dataHandler ? request.dataHandler(responseObject) : nil; --count ? : (_completionHandler ? _completionHandler(errorArray) : nil); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { request.dataHandler ? request.dataHandler(nil) : nil; NSMutableDictionary *dic = [NSMutableDictionary dictionary]; [dic setValue:requests forKey:@"request"]; [dic setValue:error forKey:@"error"]; [errorArray addObject:dic]; --count ? : (_completionHandler ? _completionHandler(errorArray) : nil); }]; }}
- 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
使用封装好的类
调用单个请求方法:
APPRequest *request = [[APPRequest alloc] init];request.URLString = @"http://www.baidu.com"; request.parameters = nil; request.dataHandler = ^(id _Nullable responseObject) { NSLog(@"request:%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);};
调用多个请求方法:
APPRequest *request0 = [[APPRequest alloc] init]; request0.URLString = @"http://www.baidu.com"; request0.parameters = @{}; request0.dataHandler = ^(id _Nullable responseObject) { NSLog(@"request0:%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); }; APPRequest *request1 = [[APPRequest alloc] init]; request1.URLString = @"http://www.baidu.com"; request1.parameters = @{}; request1.dataHandler = ^(id _Nullable responseObject) { NSLog(@"request1:%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); }; APPRequest *request2 = [[APPRequest alloc] init]; request2.URLString = @"http://www.baidu.com"; request2.parameters = @{}; request2.dataHandler = ^(id _Nullable responseObject) { NSLog(@"request2:%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); }; APPRequest *request3 = [[APPRequest alloc] init]; request3.URLString = @"http://www.baidu.com"; request3.parameters = @{}; request3.dataHandler = ^(id _Nullable responseObject) { NSLog(@"request3:%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); }; APPRequest *request4 = [[APPRequest alloc] init]; request4.URLString = @"http://www."; request4.parameters = @{}; request4.dataHandler = ^(id _Nullable responseObject) { NSLog(@"request4:%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]); }; APPNetworking *networking = [[APPNetworking alloc] init]; [networking MultipleRequests:@[request0, request1, request2, request3, request4]]; [networking setCompletionHandler:^(NSArray * _Nullable NotRequestedes) { if ([NotRequestedes count]) { NSDictionary *dic = [NotRequestedes objectAtIndex:0]; NSLog(@"error:%@",[dic objectForKey:@"error"]); } NSLog(@"请求完成"); }];
- 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