AFNetworking是一款在OS X和iOS下都令人喜爱的网络库。AFNetworking适用于iOS以及Mac OS X. 它构建于在NSURLConnection, NSOperation, 以及其他熟悉的Foundation技术之上. 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松。
为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。本指南将引导您完成这个过程。
CORE:
AFURLConnectionOperation:一个 NSOperation 实现了NSURLConnection 的代理方法.
HTTP Requests:
AFHTTPRequestOperation:AFURLConnectionOperation的子类,当request使用的协议为HTTP和HTTPS时,它压缩了用于决定request是否成功的状态码和内容类型.
AFJSONRequestOperation:AFHTTPRequestOperation的一个子类,用于下载和处理jason response数据.
AFXMLRequestOperation:AFHTTPRequestOperation的一个子类,用于下载和处理xml response数据.
AFPropertyListRequestOperation:AFHTTPRequestOperation的一个子类,用于下载和处理property list response数据.
HTTP CLIENT:
AFHTTPClient:捕获一个基于http协议的网络应用程序的公共交流模式.包含:
使用基本的url相关路径来只做request
为request自动添加设置http headers.
使用http 基础证书或者OAuth来验证request
为由client制作的requests管理一个NSOperationQueue
从NSDictionary生成一个查询字符串或http bodies.
从request中构建多部件
自动的解析http response数据为相应的表现数据
在网络可达性测试用监控和响应变化.
IMAGES
AFImageRequestOperation:一个AFHTTPRequestOperation的子类,用于下载和处理图片.
UIImageView+AFNetworking:添加一些方法到UIImageView中,为了从一个URL中异步加载远程图片
AFNetworking使用总结
1 将AFNetWorking文件夹导入项目
2 添加类库 Security.framework、MobileCoreServices.framework、SystemConfiguration.framework
3 在使用的地方 #import "AFNetworking.h"
解决编译时警告:
Prefix.pch文件中加入 #import <SystemConfiguration/SystemConfiguration.h> #import <MobileCoreServices/MobileCoreServices.h>
注:AFNetWorking使用了ARC ,在不使用ARC项目中使用时,对AFNetWorking的所有.m文件添加“-fobjc-arc”
在使用ARC项目中,使用“不使用ARC”的类库时,对类库的.m文件添加“-fno-objc-arc”
AFHTTPRequestOperation 核心代码
与NSURLConnection对象不同,每个共享应用范围的设置如会话管理、缓存策略、Cookie存储以及URL协议等,这些NSURLSession对象都可以单独进行配置。使用特定的配置来初始化会话,它可以发送任务来获取数据,并上传或下载文件。
在AFNetworking 2.0中,使用AFHTTPRequestOperation,有可能创建一个没有额外开销的独立的网络请求来获取数据。NSURLSession则需要更多的开销,为了获得所要请求的数据。
接下来,将要通过AFHTTPSessionManager创建一个对象,并创建一个任务和启动它。
iOS- 利用AFNetworking(AFN) - 实现图片上传
官方建议AFN的使用方法
1. 定义一个全局的AFHttpClient:包含有
1> baseURL
2> 请求
3> 操作队列 NSOperationQueue
2. 由AFHTTPRequestOperation负责所有的网络操作请求
3. 修改xxx-Prefix.pch文件
#import <MobileCoreServices/MobileCoreServices.h>
#import <SystemConfiguration/SystemConfiguration.h>
0.导入框架准备工作
•1. 将框架程序拖拽进项目
•2. 添加iOS框架引用
–SystemConfiguration.framework
–MobileCoreServices.framework
•3. 引入
#import "AFNetworking.h"
1.AFN的客户端,使用基本地址初始化,同时会实例化一个操作队列,以便于后续的多线程处理
1 @interfaceViewController () 2
3 { 4
5 // AFN的客户端,使用基本地址初始化,同时会实例化一个操作队列,以便于后续的多线程处理 6
7 AFHTTPClient *_httpClient;17 NSOperationQueue *_queue;18
19 }
1 - (void)viewDidLoad2 {3 [super viewDidLoad];4
5 NSURL *url = [NSURL URLWithString:@"http://192.168.3.255/~apple/qingche"];6 _httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];7
8 _queue = [[NSOperationQueue alloc] init];9 }
2.利用AFN实现文件上传操作细节
1 #pragma mark - 文件上传 2 - (IBAction)uploadImage 3 { 4 /*
5 此段代码如果需要修改,可以调整的位置
6
7 1. 把upload.php改成网站开发人员告知的地址
8 2. 把file改成网站开发人员告知的字段名
9 */10 // 1. httpClient->url11
12 // 2. 上传请求POST13 NSURLRequest *request = [_httpClient multipartFormRequestWithMethod:@"POST" path:@"upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {14 // 在此位置生成一个要上传的数据体15 // form对应的是html文件中的表单16
17
18 UIImage *image = [UIImage imageNamed:@"头像1"];19 NSData *data = UIImagePNGRepresentation(image);20
21 // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名22 // 要解决此问题,23 // 可以在上传时使用当前的系统事件作为文件名24 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];25 // 设置时间格式26 formatter.dateFormat = @"yyyyMMddHHmmss";27 NSString *str = [formatter stringFromDate:[NSDate date]];28 NSString *fileName = [NSString stringWithFormat:@"%@.png", str];29
30
31 /*32 此方法参数
33 1. 要上传的[二进制数据]
34 2. 对应网站上[upload.php中]处理文件的[字段"file"]
35 3. 要保存在服务器上的[文件名]
36 4. 上传文件的[mimeType]
37 */38 [formData appendPartWithFileData:data name:@"file" fileName:fileName mimeType:@"image/png"];39 }];40
41 // 3. operation包装的urlconnetion42 AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];43
44 [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {45 NSLog(@"上传完成");46 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {47 NSLog(@"上传失败->%@", error);48 }];49
50 //执行51 [_httpClient.operationQueue addOperation:op];