您的位置:首页 > 移动开发 > IOS开发

iOS开发AFNetworking的使用

2016-05-06 16:58 447 查看
AFHTTPRequestOperationManager

整个框架的核心类(IOS7以前),可用来创建并发送请求,获得并解析返回数据,检测网络连接情况,管理RequestOperation。

使用AFHTTPRequestOperationManager完成网络操作非常简单,只需要

1.获取AFHTTPRequestOperationManager的实例。

2.给实例传入请求类型,url(string类型),网络参数。

3.在success block中处理返回的数据,或在failure block中处理error。

举一个用AFHTTPRequestOperationManager完成get请求的例子:
//创建manager实例

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

//给manager传入参数

[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation
*operation, id responseObject) {

//处理返回的

ObjectNSLog(@"JSON: %@", responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

//处理失败

NSLog(@"Error: %@", error); }];

如果对manager处理的网络操作有更高的要求,还可以

1.设置manger的baseURL,通过对baseURL的连接测试检测当前网络状况:
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

switch (status) {

//WWAN状态下操作case

AFNetworkReachabilityStatusReachableViaWWAN:break; //WiFi状态下操作case

AFNetworkReachabilityStatusReachableViaWiFi:break; //无法连接下操作case

AFNetworkReachabilityStatusNotReachable:break;default:break;}

}];

2.设置安全策略

manager.securityPolicy.allowInvalidCertificates = YES;

AFHTTPRequestOperationManager的作用更多是管理Operation,实际的网络请求操作由AFHTTPRequestOperation来完成,下面简要的介绍一下这个类。

AFHTTPRequestOperation

直接上代码,用该类完成get请求:
NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"];

NSURLRequest *request = [NSURLRequest requestWithURL:URL];

AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];

op.responseSerializer = [AFJSONResponseSerializer serializer];

[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

NSLog(@"JSON: %@", responseObject);}

failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"Error: %@", error);}];

[[NSOperationQueue mainQueue] addOperation:op];

不添加注释了,因为和苹果原生的网络操作非常相似,主要区别有两点

1.用block取代委托,好处是让代码更加紧凑易读。

2.通过设置op.responseSerializer,自动完成返回数据的解析,直接获取json格式的responseObject。

直接使用这个类处理网络操作是不明智的(复杂,难于管理)。但可以通过它了解AFHTTPRequestOperationManager内部的工作原理。

AFHTTPRequestOperationManager传入的参数是URL 和 parameters,AFHTTPRequestOperation传入的参数是Request。他们之间是如何协同的?

通过AFHTTPRequestSerializer。

RequestSerializer && ResponseSerializer

使用AFHTTPRequestOperationManager处理网络操作时,不需要直接调用这两种类的实例方法,只要设置manager.requestSerializer和manager.responseSerializer为需要的实例即可。不过可以通过代码看一下他们是如何工作的。

1.RequestSerializer

[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters];

RequestSerializer把AFHTTPRequestOperationManager传入的参数序列化 形成格式为:POST http://example.com/Content-Type: application/x-www-form-urlencoded foo=bar&baz[]=1&baz[]=2&baz[]=3 的Request。这样manager中的op就可以继续工作了。

2.ResponseSerializer

目前并没有开放的ResponseSerializer解析代码。manager会根据manager.responseSerializer的类型自动解析responseOBJ。貌似默认解析JSON(不确定)。

一些实用的Category

AFNetworking还写了一些网络操作可能会用到控件的类别,扩展了他们的功能包括:

UIActivityIndicatorView(AFNetworking)

UIAlertView(AFNetworking)

UIButton(AFNetworking)

UIImageView(AFNetworking)

UIProgressView(AFNetworking)

UIRefreshControl(AFNetworking)

UIWebView(AFNetworking)

用UIWebView(AFNetworking)举个例子吧:

- (void)loadRequest:(NSURLRequest *)request progress:(void ( ^ ) ( NSUInteger bytesWritten , NSInteger totalBytesWritten , NSInteger totalBytesExpectedToWrite ))progress success:(NSString
*( ^ ) ( NSHTTPURLResponse *response , NSString *HTML ))success failure:(void ( ^ ) ( NSError *error ))failure

block progress,success,failure 处理了UIWebView请求后的所有事件,尤其是progress,直接用苹果的webview想检测请求的进度是很麻烦的,这个很简单。其他的类别就不一一介绍了,都挺好的。

whats new

2.0更新最重要的内容是推出了全面支持IOS7新特性NSURLSession的AFHTTPSessionManager。要掌握AFHTTPSessionManager,首先要全面了解NSURLSession,比如它的工作原理,苹果为何力推NSURLSession取代NSURLConnection。

IOS7中AFHTTPSessionManager会逐渐取代AFHTTPRequestOperationManager。这一块儿我正在研究ing,推荐文章:忘记NSURLConnection,拥抱NSURLSession吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: