iOS 网络编程:AFNetworking
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。
1 #include "AFNetworking.h"
2 -(void)DownloadTask
3 {
4 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
5 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
6
7 NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
8 NSURLRequest *request = [NSURLRequest requestWithURL:URL];
9
10 NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
11 NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
12 return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
13 } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
14 NSLog(@"File downloaded to: %@", filePath);
15 }];
16 [downloadTask resume];
17 }
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自带的类。
1 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; //步骤1
2 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; //步骤2
3
4 //步骤3
5 NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
6 NSURLRequest *request = [NSURLRequest requestWithURL:URL];
7 NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
8 if (error) {
9 NSLog(@"Error: %@", error);
10 } else {
11 NSLog(@"%@ %@", response, responseObject);
12 }
13 }];
14 [dataTask resume]; //步骤4
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块:
1 - (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方法:
1 -(void)HTTPSessionManager
2 {
3 AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];
4 [manager GET:@"http://example.com/foo.json" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
5 NSLog(@"success");
6 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
7 NSLog(@"error");
8 }];
9 }
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 参考文献
[1] URL Session programming guide。
[2] AFNetworking GitHub地址
iOS 网络编程:AFNetworking的更多相关文章
- IOS网络编程——第三方类库
IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他
- iOS网络编程模型
iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...
- IOS网络编程:HTTP
IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...
- iOS网络编程笔记——Socket编程
一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...
- iOS:网络编程的第三方框架:AFNetworking、SDWebImage
网络编程第三方框架:AFNetworking.SDWebImage 介绍:这些框架是开源的,经过前人的封装.改进,成为使用次数很多的一个性能好的源代码框架,只需要将它导入项目中,就可以使用.因此,在做 ...
- iOS网络编程
今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...
- 浅谈iOS网络编程之一入门
计算机网络,基本上可以抽象是端的通信.实际在通讯中会用到不同的设备,不同的硬件中,为了能友好的传输信息,那么建立一套规范就十分必要了.先来了解一些基本概念 了解网络中传输的都是二进制数据流. 2.了 ...
- iOS 网络编程:socket
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- iOS 网络编程模式总结
IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式.stream方式.url 方式. 一 .socket 方式 IOS 提供的socket 方式的网络编程接口为C ...
- ios网络编程(入门级别)-- 基础知识
在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...
随机推荐
- 应付分配集 Distribution Sets
(N) AP > Setup > Invoice > Distribution Sets (定义分配集) You can use a Distribution Set to auto ...
- java常量池概念
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
- c#基础这些你都看过吗?(一)-----仅供初学者使用
1.注释(不写注释是流氓,名字瞎起是扯淡)‘///’一般用于注释函数,注释类.2.快捷键ctrl+k+d(有语法错误无法进行对齐)ctrl+j(快速弹出只能提示)shift+end,shift+hom ...
- 【CSS3】
Web前端实验室http://demo.doyoe.com/ ::before ::afterCSS3已经将伪元素的前缀更改为双冒号,而伪类则保持为单冒号 backface-visibility ht ...
- jquery formatCurrency货币格式化处理
// This file is part of the jQuery formatCurrency Plugin. // // The jQuery formatCurrency Plugin is ...
- [原创][下载]Senparc.Weixin.MP-微信公众平台SDK(C#) - 已支持微信6.x API
因为正在计划做一个微信机器人,需要用ASP.NET,找了一下只有PHP的SDK,没有C#的,于是动手写了一个,已经全面支持微信6.x所有接口,包括多客服.卡券.微信支付等. 微信公众平台地址:http ...
- 安装tcpreplay时报错:configure: error: libdnet not found
安装tcpreplay时报错configure: error: libdnet not found 解决方法: 下载包libdnet-1.8.tar.gz并安装,依次执行: ./configure m ...
- 多线程模式之MasterWorker模式
多线程模式之MasterWorker模式 Master-Worker模式的核心思想是,系统由两类进程协作工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负 ...
- 【原】Windows中使用Redis基本入门教程
Redis是c编写基于Unix平台开发的一种内存KV数据库,官网上并没有给出Window的安装包,但MS基于redis发布了Windows版本. 下载链接: https://github.com/MS ...
- Html笔记(三)列表
列表标签: <dl> <dt>:上层标签 <dd>:下层标签 例: <dl> <dt>上层项目</dt> <dd>下 ...