1 简介
1.1 概念
AFNetworking网络框架并不是IOS自带的框架,而是第三方的开源框架。它是对NSURLConnection和NSURLSession API的封装,但是目前AFNetworking 3.0已经删除了基于 NSURLConnection API的所有支持,所以本文只记录基于NSURLSession API的相关接口。AFNetworking 框架是基于Object-C语言,若需要使用Swift语言版可以了解Alamofire框架。
个人感觉学习AFNetworking 框架非常麻烦,它没有提供guide,所以只能按着GitHub和头文件进行学习。
1.2 第一个程序
1.2.1 环境配置
环境配置非常简单,有多种方式,在GitHub提供了几种方法,这里使用最简单的方式:导入源码。
新建IOS项目后,导入在GitHub网站下载的AFNetworking 源码,如图 2所示。
?
?
图 2
1.2.2 源码
其使用如下所示,只需引入AFNetworking.h文件即可使用其API。
#include "AFNetworking.h" -(void)DownloadTask { NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; ? NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; ? NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { NSLog(@"File downloaded to: %@", filePath); }]; [downloadTask } |
?
?
2 AFURLSessionManager
AFURLSessionManager是对NSURLSession的封装,其实现了NSURLSession的四个协议。所以提供的功能与NSURLSession一样,拥有三种任务类型:dataTask、uploadTask和downloadTask。
2.1 使用步骤
其实AFURLSessionManager对NSURLSession的封装,只封装了两个部分:
- 创建NSURLSession对象的过程;
- 创建NSURLSessionTask对象过程。
?
从而AFURLSessionManager与NSURLSession类似,如下是使用步骤:
- 创建NSURLSessionConfiguration对象;(与NSURLSession一样)
- 通过传递NSURLSessionConfiguration对象,创建AFURLSessionManager对象;
- 通过传递请求对象(如NSURLRequest对象)给AFURLSessionManager对象的某个方法,从而创建任务(NSURLSessionTask);
- 调用NSURLSessionTask对象的resume来启动任务。
?
如下是创建一个Data Task,只有AFURLSessionManager 是AFNetworking提供的类,其它都是IOS自带的类。
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; //步骤1 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; //步骤2 ? //步骤3 NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; NSURLSessionDataTask *dataTask = [manager if (error) { NSLog(@"Error: %@", error); } else { NSLog(@"%@ %@", response, responseObject); } }]; [dataTask |
?
2.2 提供的功能
AFURLSessionManager提供的三种任务类型:dataTask、uploadTask和downloadTask,所以提供的功能都是围着这三种任务类型。
2.2.1 创建任务
可以调用AFURLSessionManager对象的相应方法来创建三种任务:
表 31 AFURLSessionManager对象创建任务方法
任务类型 |
创建方法 |
语义 |
NSURLSessionDataTask |
dataTaskWithRequest:request:completionHandler: |
用NSURLRequest对象创建任务。 |
dataTaskWithRequest:request:uploadProgress:downloadProgress: |
用NSURLRequest对象创建任务。 |
|
NSURLSessionUploadTask |
uploadTaskWithRequest:request: fromFile: |
用NSURLRequest对象创建上传任务,上传的路径是NSURL所指的路径。 |
uploadTaskWithRequest:request: fromData: |
用NSURLRequest对象创建上传任务,上传的是HTTP体。 |
|
uploadTaskWithStreamedRequest:request: |
用streaming NSURLRequest对象创建上传任务, |
|
NSURLSessionDownloadTask |
downloadTaskWithRequest:request: |
用NSURLRequest对象创建下载任务。 |
downloadTaskWithResumeData:resumeData |
用NSData对象创建下载任务。 |
?
2.2.2 获取任务对象
由于AFURLSessionManager对象可以创建三种类型的任务,并且当创建完成后其内部存在所有已经创建任务对象的引用,在AFURLSessionManager对象内部有四个任务集合:
- tasks:表示当前在managed session运行的data, upload, 和download任务;
- dataTasks:表示当前在managed session运行的data任务;
- uploadTasks:表示当前在managed session运行的 upload任务;
- downloadTasks。表示当前在managed session运行的download任务。
?
2.2.3 监听任务状态
AFURLSessionManager对象可以对所创建的任务进行监听,当这些任务发生变化时,可以执行指定的block块,具体内容可以参考该类的.h文件。
如下是AFURLSessionManager对象的一个方法声明,其语义是指当data task任务收到data对象时,就执行block块:
- (void)setTaskDidCompleteBlock:(nullable void (^)(NSURLSession *session, NSURLSessionTask *task, NSError * _Nullable error))block; |
?
3 AFHTTPSessionManager
AFHTTPSessionManager类是AFURLSessionManager类的子类,它只是提供的一些方便进行HTTP请求的方法。当然AFURLSessionManager类本身也可以进行HTTP请求,但需要配置NSURLRequest对象。
3.1 使用步骤
AFHTTPSessionManager使用起来比AFURLSessionManager更加简单,其使用步骤是:
- 创建AFHTTPSessionManager对象;
- 调用HTTP方法。
?
如下是使用HTTP的GET方法:
-(void)HTTPSessionManager { AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; [manager GET:@"http://example.com/foo.json" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"success"); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"error"); }]; } |
?
3.2 提供的方法
AFHTTPSessionManager类提供的6种常用的HTTP方法:
表 32 AFHTTPSessionManager类提供的HTTP方法
HTTP方法 |
类方法 |
语义 |
GET |
GET:URLStringparameters: success:failure: |
从服务器获取一份文档 |
GET:URLString:parameters: progress: success: failure: |
||
HEAD |
HEAD:URLString:parameters:success:failure: |
只从服务器获取文档的首部 |
POST |
POST:URLString:parameters:progress:success:failure: |
向服务器发送需要处理的数据 |
PUT |
PUT:URLString:parameters:success:failure: |
将请求的主体部分存储在服务器上。 |
PATCH |
PATCH:URLString:parameters:success:failure: |
对可能经过代理服务器传送到服务器上去的报文进行追踪。 |
DELETE |
DELETE:URLString:parameters:success:failure: |
从服务器上删除一份文档。 |
?
4 参考文献
- URL Session programming guide。
- AFNetworking GitHub地址
- ?