AFNetworking学习笔记
1. 将AFNetworking导入项目中
注:AFNetWorking使用了ARC ,在不使用ARC项目中使用时,对AFNetWorking的所有.m文件添加“-fobjc-arc”
2. 添加3个类库:Security.framework、MobileCoreServices.framework、SystemConfiguration.framework
3.先编译一下程序,如果这时就有编译错误就在Prefix.pch文件中加入
#import<SystemConfiguration/SystemConfiguration.h>
#import<MobileCoreServices/MobileCoreServices.h>
4.AFN的特性
(1) AFURLConnectionOperation以及他的子类都继承自NSOperation, 可以对他进行 start/cancel/pause/resume 操作,可以获取对应的 NSURLRequest 和 NSURLResponse 数据。支持 NSInputStream/NSOutputStream,提供了 uploadProgress 和 downloadProgress以方便其他使用。
(2) AFNetworking可以将远程媒体数据类型(NSData)转化为可用的格式,比如JSON,XML,图像和plist。
(3)AFHTTPClient提供了一个方便的网络交互接口,包括默认头,身份验证,是否连接到网络,批量处理操作,查询字符串参数序列化,以及多种表单请求
5.AFN与系统的HTTP请求API的对应关系
l AFURLConnectionOperation-NSOperation的子类,负责管理 NSURLConnection 并且实现其 delegate 方法。 l AFHTTPRequestOperation - AFURLConnectionOperation 的子类,用于生成 HTTP 请求,可以区别可接受的和不可接受的状态码及内容类型 l AFHTTPRequestOperationManager - 包装常见 HTTP web 服务操作的类,通过AFHTTPRequestOperation 由 NSURLConnection 支持
| NSURLConnection
|
l AFURLSessionManager - 创建、管理基于 NSURLSessionConfiguration 对象的NSURLSession 对象的类,也可以管理 session 的数据、下载/上传任务,实现 session 和其相关联的任务的 delegate 方法。 l AFHTTPSessionManager - AFURLSessionManager 的子类,包装常见的 HTTP web 服务操作,通过 AFURLSessionManager 由 NSURLSession 支持。
| NSURLSession (iOS 7 / Mac OS X 10.9)
|
§ AFHTTPRequestSerializer § AFJSONRequestSerializer § AFPropertyListRequestSerializer § AFHTTPResponseSerializer
| AFURLRequestSerialization
|
§ AFJSONResponseSerializer § AFXMLParserResponseSerializer § AFXMLDocumentResponseSerializer (Mac OS X) § AFPropertyListResponseSerializer § AFImageResponseSerializer § AFCompoundResponseSerializer
| AFURLResponseSerialization
|
| Additional Functionality
|
6.AFN的使用
1)AFHTTPRequestOperation
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: url]];
//创建一个AF的请求队列
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
//设置请求完成或失败的block
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", operation.responseString);
NSData *resData = [[NSData alloc]initWithData:operation.responseData]; //系统自带JSON解析
NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:resData options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"resultDic:%@",resultDic);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure: %@", error);
}];
//开始执行队列中的请求
[operation start];
2) AFHTTPRequestOperationManager
GET和POST请求(所有的网络请求,均有manager发起 )
要使用常规的AFN网络访问,要特别注意请求的数据的格式,否则很容易请求失败
1. 需要注意的是,默认提交请求的数据是二进制的,返回格式是JSON
2. 请求格式
AFHTTPRequestSerializer 二进制格式
AFJSONRequestSerializer JSON
AFPropertyListRequestSerializer PList(是一种特殊的XML,解析起来相对容易)
3. 返回格式
AFHTTPResponseSerializer 二进制格式
AFJSONResponseSerializer JSON
AFXMLParserResponseSerializer XML,只能返回XMLParser,还需要自己通过代理方法解析
AFXMLDocumentResponseSerializer (Mac OS X)
AFPropertyListResponseSerializer PList
AFImageResponseSerializer Image
AFCompoundResponseSerializer 组合
//GET请求
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//请求成功运行success块,请求失败failure块
[manager GET:@"http://www.weather.com.cn/data/sk/101010300.html" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"请求成功");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"请求失败:%@",error);
\}];
//post请求
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *dict = @{@"name": @"zhangsan"};
NSDictionary *dict1 = @{@"name": @"wangwu"};
NSArray *array = @[dict, dict1];
// 设置请求格式
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 设置返回格式
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:@"要提交数据的链接" parameters:array success:^(AFHTTPRequestOperation
operation, id responseObject) {
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@", result);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error: %@",error);
}];
3) AFHTTPRequestSerializer & AFHTTPResponseSerializer(请求序列化和相应序列化)
//RequestSerializer给manager一个post请求
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:baseUrl parameters:parameters error:nil];
在AFHTTPRequestOperationManager则不需要实例化AFHTTPRequestSerializer的对象,只要设置 manager.requestSerializer = [AFHTTPRequestSerializer serializer];
关于序列化的使用还在研究,以后有心得再来分享!
7. UIKit 扩展
之前AFNetworking 中的所有 UIKit category 都被保留并增强,还增加了一些新的 category。
· AFNetworkActivityIndicatorManager:在请求操作开始、停止加载时,自动开始、停止状态栏上的网络活动指示图标。
· UIImageView+AFNetworking:增加了 imageResponseSerializer 属性,可以轻松地让远程加载到 image view 上的图像自动调整大小或应用滤镜。比如,AFCoreImageSerializer可以在 response 的图像显示之前应用 Core Image filter。
· UIButton+AFNetworking (新):与 UIImageView+AFNetworking 类似,从远程资源加载image 和 backgroundImage。
· UIActivityIndicatorView+AFNetworking (新):根据指定的请求操作和会话任务的状态自动开始、停止 UIActivityIndicatorView。
· UIProgressView+AFNetworking (新):自动跟踪某个请求或会话任务的上传/下载进度。
· UIWebView+AFNetworking (新): 为加载 URL请求提供了更强大的API,支持进度回调和内容转换。