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类似,如下是使用步骤:

  1. 创建NSURLSessionConfiguration对象;(与NSURLSession一样)
  2. 通过传递NSURLSessionConfiguration对象,创建AFURLSessionManager对象;
  3. 通过传递请求对象(如NSURLRequest对象)给AFURLSessionManager对象的某个方法,从而创建任务(NSURLSessionTask);
  4. 调用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更加简单,其使用步骤是:

  1. 创建AFHTTPSessionManager对象;
  2. 调用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的更多相关文章

  1. IOS网络编程——第三方类库

    IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他

  2. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  3. IOS网络编程:HTTP

    IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...

  4. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  5. iOS:网络编程的第三方框架:AFNetworking、SDWebImage

    网络编程第三方框架:AFNetworking.SDWebImage 介绍:这些框架是开源的,经过前人的封装.改进,成为使用次数很多的一个性能好的源代码框架,只需要将它导入项目中,就可以使用.因此,在做 ...

  6. iOS网络编程

    今天的重点是UIWebView.NSURLSession.JSon. 网络编程联网准备:1.在Info.plist中添加AppTransportSecurity类型Dictionary:2.在AppT ...

  7. 浅谈iOS网络编程之一入门

    计算机网络,基本上可以抽象是端的通信.实际在通讯中会用到不同的设备,不同的硬件中,为了能友好的传输信息,那么建立一套规范就十分必要了.先来了解一些基本概念 了解网络中传输的都是二进制数据流.  2.了 ...

  8. iOS 网络编程:socket

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  9. iOS 网络编程模式总结

    IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式.stream方式.url 方式. 一 .socket 方式 IOS 提供的socket 方式的网络编程接口为C ...

  10. ios网络编程(入门级别)-- 基础知识

    在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...

随机推荐

  1. UVA_11468_Substring_(AC自动机+概率动态规划)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  2. JQuery datepicker 用法

    JQuery datepicker 用法   jQuery UI很强大,其中的日期选择插件Datepicker是一个配置灵活的插件,我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加 ...

  3. 一步一步学Remoting系列文章

    转自:http://www.cnblogs.com/lovecherry/archive/2005/05/24/161437.html (原创)一步一步学Remoting之一:从简单开始(原创)一步一 ...

  4. NOIP2013 花匠 DP 线段树优化

    网上一堆题解,我写的是N^2优化的那种,nlogn,O(n)的那种能看懂,但是让我自己在赛场写,肯定没戏了 #include <cstdio> #include <iostream& ...

  5. [转]ASP.NET MVC 入门6、TempData

    ASP.NET MVC的TempData用于传输一些临时的数据,例如在各个控制器Action间传递临时的数据或者给View传递一些临时的数据,相信大家都看过“在ASP.NET页面间传值的方法有哪几种” ...

  6. redis.conf 配置详解

    # Redis 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写) # # 1k => 1000 bytes # 1kb = ...

  7. FFT矩阵

    举个例子: \[{F_4}=\left[{\begin{array}{*{20}{c}}1&1&1&1\\1&i&{-1}&{-i}\\1&{- ...

  8. [TYVJ1827]『Citric II』一道防AK好题

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 第二届『Citric杯』NOIP提高组模拟赛第一题 描述 Lemon认为在第一届『Citric』杯模拟赛中出的 ...

  9. 五指cms标签说明汇总

    1.栏目列表标签 只有一级导航: {wz:content action="category" cid="0" pagesize="100" ...

  10. vijosP1164 曹冲养猪

    vijosP1164 曹冲养猪 链接:https://vijos.org/p/1164 [思路] 数学. 如果x不能满足模公式则+gcd,gcd=a的积(a互质)使加上gcd后依然满足前面的模公式. ...