关闭

iOS开发AFNetworking的使用

104人阅读 评论(0) 收藏 举报

这两天研究了一下AFNetworking框架,发现非常好用,把心得和大家分享一下。

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, idresponseObject) {//处理返回的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吧!

http://www.objc.io/issue-5/from-nsurlconnection-to-nsurlsession.html

其实这一块儿可以单独share一次,因为真的很深奥(看不懂)!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:114748次
    • 积分:1607
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:276篇
    • 译文:0篇
    • 评论:9条
    最新评论