iOS网络-AFNetworking详解

来源:互联网 发布:iapp制作文字游戏源码 编辑:程序博客网 时间:2024/06/03 20:06

前面说了一下官方给的网络请求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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

创建会话类型

AFNetworking 核型功能是由AFURLSessionManager完成,AFHTTPSessionManager是对HTTP请求的一次封装。下面就用AFHTTPSessionManager创建一个会话对象

//实现懒加载- (AFHTTPSessionManager*)sessionManager{    if (!_sessionManager) {        //获取AFHTTPSessionManager对象        _sessionManager = [AFHTTPSessionManager manager];        //设置响应对象        _sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];        //告诉AFNetworking我们可以接收网页        _sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];    }    //返回对象    return _sessionManager;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

创建单个请求

接下来实现单个请求方法;

/** * 单个请求方法,给定请求对象,创建请求任务。 * @param (APPRequest* _Nullable)request */- (void)SingleRequest:(APPRequest* _Nullable)request{    //通过request对象,传入URL地址、参数、实现success,把接收到的数据通过dataHandler传递给调用者;    [[self sessionManager] POST:request.URLString parameters:request.parameters progress:^(NSProgress * _Nonnull uploadProgress) {    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        //调用block,回传数据        request.dataHandler ? request.dataHandler(responseObject) : nil;    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {       //调用block,回传nil        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,影响性能。因此封装一个多个请求对象的方法。

/** * 请求多个对象的方法,给定请求对象,创建请求任务。 * @param (NSArray* _Nullable)requests 它是一组由APPRequest创建的对象。 * note://多个请求,当多个都请求完成以后,会回调completionHandler,请实现completionHandler; */- (void)MultipleRequests:(NSArray* _Nullable)requests{    //统计有多少个请求对象    __block NSUInteger count = [requests count];    // 创建一个错误数组,请求失败后,告诉用户哪些请求对象请求失败了。    NSMutableArray *errorArray = [NSMutableArray array];    //进行for 循环,根据APPRequest创建多个任务。    for (APPRequest *request in requests) {        [[self sessionManager] POST:request.URLString parameters:request.parameters progress:^(NSProgress * _Nonnull uploadProgress) {        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {            //判断调用者是否实现了dataHandler,如果实现了,回调。            request.dataHandler ? request.dataHandler(responseObject) : nil;            //这句话是判断,请求的数据是否都返回回来了。如果count=0 则调用完成回调块            --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=0 则调用完成回调块            --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]);};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

调用多个请求方法:

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) {       // 这里会判断NotRequestedes,如果它大于0,说明此次请求有请求失败的对象        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
原创粉丝点击