前三节,我详细的介绍了ASI的概念及基本使用。如果想了解的,请点击这里。由于AFN与ASI有很多相似的地方,所以我打算用一节的篇幅来介绍AFN。下载地址: https://github.com/AFNetworking/AFNetworking
AFN即AFNetworiking,AFN的主要结构如下:
1 : AFHTTPClient
提供了一个方便的网络交互接口,包括默认头,身份验证,是否连接到网络,批量处理操作,查询字符串参数序列化,已经多种表单请求
2 : AFHTTPRequestOperation
和它得子类可以基于http状态和内容列下来区分是否成功请求了
3 : AFURLConnectionOperation
和它的子类继承NSOperation的,允许请求被取消,暂停/恢复和由NSOperationQueue进行管理。
4 : AFURLConnectionOperation
可以让你轻松得完成上传和下载,处理验证,监控上传和下载进度,控制的缓存。
使用介绍:
1.Get请求
#pragma mark - 服务端返回的json数据(Example:调用天气预报接口) -(void)jsonResponse { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 默认的responseSerializer是AFJSONResponseSerializer,所以下面一句可以不用书写 // manager.responseSerializer = [AFJSONResponseSerializer serializer]; //异步线程 [manager GET:@"http://apis.haoservice.com/weather" parameters:@{@"cityname":@"上海"} success:^(AFHTTPRequestOperation *operation, id responseObject) { //如果返回的response是json数据,那么最终得到的responseObject是字典或者数组 NSLog(@"Result:%@",responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error:%@",error); }]; } #pragma mark - 想要返回html数据(Example:在百度搜索"上海") -(void)commonResponse { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //异步线程 [manager GET:@"http://baike.baidu.com/link" parameters:@{@"url":@"DiOqVUurNw8HeMTTg0vhITJHuceUBUGS82tYYklR_p2UyBHtX7rM7t9RTRicuqVPr6qMATivos2fhALM2ETGKq"} success:^(AFHTTPRequestOperation *operation, id responseObject) { // 如果返回的response是AFHTTPResponseSerializer信息,那么得到的responseObject可以转化为string显示 NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"Result:%@",result); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error:%@",error); }]; }
2. Post请求
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; // 非文件参数,如:用户名,密码等信息 NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"username"] = @"jason"; params[@"password"] = @"123"; [mgr POST:@"PostUrl" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 一定要在block中添加文件参数 NSString *name = [[NSBundle mainBundle] pathForResource:@"Icon" ofType:@"png"]; NSData *data = [NSData dataWithContentsOfFile:name]; // name: 是后台服务器接收上传文件对应的参数 [formData appendPartWithFileData:data name:@"test.txt" fileName:@"file" mimeType:@"text/plain"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }];
至此,我已经将ASI与AFN介绍完毕,下面将它们进行对比,大家斟酌该选择谁......
1. 原理分析
观察上面的结构图可以看出: ASI基于CFNetwork框架开发,而AFN基于NSURL,底层的区别是导致二者性能差距的重要原因之一。理论上,ASI的性能优于AFN。
2. 版本提交的时间来看:
AFN的第一个提交是2011年的1月1日,那个时候ASI早已是1.8+的版本了;而当AFN发布1.0版,2012年10月份的时候,ASI早早的已经停止更新了。这样看起来,AFN是ASI的继任者,似乎不存在之前提到的选择困难的问题。
最后,再为大家介绍一个派生产物:Reachability(用来判断当前网络的状态)
[[Reachability reachabilityForInternetConnection] currentReachabilityStatus]
上面这句话用来得到当前的网络状态,它返回的是一个枚举值
enum { // Apple NetworkStatus Constant Names. NotReachable = kNotReachable, ReachableViaWiFi = kReachableViaWiFi, ReachableViaWWAN = kReachableViaWWAN };