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吧!