前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS开发·第三方网络下载处理框架:AFNetworking网络下载处理(官方文档翻译篇)

iOS开发·第三方网络下载处理框架:AFNetworking网络下载处理(官方文档翻译篇)

作者头像
陈满iOS
发布于 2018-09-10 03:13:45
发布于 2018-09-10 03:13:45
77500
代码可运行
举报
文章被收录于专栏:陈满iOS陈满iOS
运行总次数:0
代码可运行

本篇文章中,笔者将着重挑选了AFNetworking官方文档中的使用部分进行了翻译。关于Pod以及Carthage安装第三方库的部分,可以参考笔者相关文章。官方源码地址传送门为https://github.com/AFNetworking/AFNetworking

1. 框架体系

1.1 NSURLSession

  • AFURLSessionManager
  • AFHTTPSessionManager

1.2 序列化

  • <AFURLRequestSerialization>
    • AFHTTPRequestSerializer
    • AFJSONRequestSerializer
    • AFPropertyListRequestSerializer
  • <AFURLResponseSerialization>
    • AFHTTPResponseSerializer
    • AFJSONResponseSerializer
    • AFXMLParserResponseSerializer
    • AFXMLDocumentResponseSerializer (Mac OS X)
    • AFPropertyListResponseSerializer
    • AFImageResponseSerializer
    • AFCompoundResponseSerializer

1.3 附加功能

  • AFSecurityPolicy
  • AFNetworkReachabilityManager

2. 使用方法

2.1 AFURLSessionManager

AFURLSessionManager用于,基于一个指定的NSURLSessionConfiguration对象,创建和管理NSURLSession对象。

它服从<NSURLSessionTaskDelegate>,<NSURLSessionDataDelegate>,<NSURLSessionDownloadDelegate>,和<NSURLSessionDelegate>等协议。

2.1.1 创建一个下载任务
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 resume];
2.1.2 创建一个上传任务
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"Success: %@ %@", response, responseObject);
    }
}];
[uploadTask resume];
2.1.3 创建一个具有进度的多部件上传任务
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
    } error:nil];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
              uploadTaskWithStreamedRequest:request
              progress:^(NSProgress * _Nonnull uploadProgress) {
                  // This is not called back on the main queue.
                  // You are responsible for dispatching to the main queue for UI updates
                  dispatch_async(dispatch_get_main_queue(), ^{
                      //Update the progress view
                      [progressView setProgress:uploadProgress.fractionCompleted];
                  });
              }
              completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
                  if (error) {
                      NSLog(@"Error: %@", error);
                  } else {
                      NSLog(@"%@ %@", response, responseObject);
                  }
              }];

[uploadTask resume];

其中,多部件请求为一次上传多个文件,例如;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:kURL parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFormData:[@"11230953" dataUsingEncoding:NSUTF8StringEncoding] name:@"uid"];
        [formData appendPartWithFileData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myText" ofType:@"txt"]] name:@"file" fileName:@"myText.txt" mimeType:@"text/plain"];
    } error:nil];
2.1.4 创建一个数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://httpbin.org/get"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"%@ %@", response, responseObject);
    }
}];
[dataTask resume];

2.2 请求序列化

请求序列化从URL字符串创建请求,并将参数编码为查询字符串或HTTP主体。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NSString * URLString = @“ http://example.com ” ;
NSDictionary * parameters = @ { @“ foo ”:@“ bar ”,@“ baz ”:@ [@ 1,@ 2,@ 3 ]};
2.2.1 查询字符串参数编码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil];
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3
2.2.2 URL格式参数编码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST http://example.com/
Content-Type: application/x-www-form-urlencoded

foo=bar&baz[]=1&baz[]=2&baz[]=3
2.2.3 JSON参数编码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST http://example.com/
Content-Type: application/json

{"foo": "bar", "baz": [1,2,3]}

2.3 网络连接管理

AFNetworkReachabilityManager用于监视域名的可达性,以及WWAN和WiFi网络接口的地址。

  • 不要用可达性来决定,是否应该发送原始请求。
  • 你应该尝试发送它。
  • 您可以使用可达性来决定,何时应自动重试请求。
  • 可达性通知(连接可用)是发起重试时间的好时机,虽然它可能仍然失败。
  • 网络可达性,是确定请求可能失败原因的一个有用工具。
  • 在网络请求失败之后,告诉他们离线的用户比给予他们一个更为技术性但准确的错误,比如“请求超时”。

另见WWDC 2012会议706“网络最佳实践”

2.3.1 共享网络可达性
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

2.4 安全策略

AFSecurityPolicy用来在安全的连接上,针对固定的X.509证书和公钥,评价服务器的可靠性。

将固定SSL证书添加到您的应用程序,有助于防止中间人攻击和其他漏洞。强烈建议,涉及到敏感客户数据或财务信息的应用程序应通过HTTPS路由到所有通信,配置并启用SSL pinning。

2.4.1 允许无效的SSL证书
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager ];
manager.securityPolicy.allowInvalidCertificates = YES ; //不推荐用于生产

3. 单元测试

AFNetworking在Tests子目录中包含了一套单元测试。这些测试可以简单地运行,以执行在您想要测试的平台框架上的测试操作。

翻译说明:

本文翻译自AFNetworking,版权归官方所有,翻译仅供学习用途,以上。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.06.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
PyTorch从入门到放弃之张量模块
张量(Tensor)是PyTorch最基本的操作对象。在几何定义中,张量是基于标量、向量和矩阵概念的眼神。通俗理解,可以讲标量视为0维张量,向量视为1维张量,矩阵视为2维张量。在深度学习领域,可以将张量视为一个数据的水桶,当水桶中只放一滴水时就是0维张量,多滴水排成一排就是1维张量,联排成面就是2维张量,以此类推,扩展到n维向量。
愷龍
2024/09/03
1600
PyTorch从入门到放弃之张量模块
PyTorch入门笔记-创建张量
Numpy Array 数组和 Python List 列表是 Python 程序中间非常重要的数据载体容器,很多数据都是通过 Python 语言将数据加载至 Array 数组或者 List 列表容器,再转换到 Tensor 类型。(为了方便描述,后面将 Numpy Array 数组称为数组,将 Python List 列表称为列表。)
触摸壹缕阳光
2020/12/02
3.6K0
PyTorch入门笔记-创建张量
PyTorch入门笔记-创建已知分布的张量
正态分布(Normal Distribution)和均匀分布(Uniform Distribution)是最常见的分布之一,创建采样自这 2 个分布的张量非常有用,「比如在卷积神经网络中,卷积核张量
触摸壹缕阳光
2020/11/20
3.6K0
PyTorch入门笔记-创建已知分布的张量
深度学习基础之三分钟轻松搞明白tensor到底是个啥
pytorch 和tensorflow 中最重要的概念就是tensor了,tensorflow 这个框架的名字中很直白,就是tensor的流动,所以学习深度学习的第一课就是得搞懂tensor到底是个什么东西了,今天就来学习下,OK,起飞
香菜聊游戏
2021/09/29
13.9K0
深度学习基础之三分钟轻松搞明白tensor到底是个啥
Python|张量创建操作[3]
说一下zeros与zeroslike和类似函数的区别。zeros是指定输出张量的形状size,然后返回张量,zeroslike则是根据一个张量,返回这个张量形状的张量。ones和ones_like类似
福贵
2020/05/27
6060
Python|张量创建操作[2]
张量的随机创建包含的方法有:torch.rand(),torch.randlike(),torch.randn(),torch.randnloike(),torch.randint(),torch.randint_like()和torch.randperm()。
福贵
2020/05/27
1.4K0
PyTorch2:张量的运算
可以看出,torch.Tensor()没有保留数值类型,其它三个都保留了。这是因为torch.Tensor()实际上是一个类,传入的数据需要“初始化”;其它三个都是函数,而通过torch.Tensor()生成的张量的数据类型是由一个环境变量决定的,这个环境变量可以通过torch.set_default_tensor_type(t)这个函数来设定。
小胡胡说
2020/08/05
2.6K0
pytorch的python API略读--tensor(二)
在编写程序的时候,我们往往需要一些数据,这些数据常有两种来源:手动输入的一些数据,或者从外部接收后转换得到的数据。手动输入的数据设计如下函数:tensor, zeros, zeros_like, ones, ones_like,arange,range,linspace,logspace,eye,empty,empty_like,empty_strided,full,full_like。
用户9875047
2022/07/04
2230
使用 C# 入门深度学习:Pytorch 基础
本文内容介绍 Pytorcn 的基础 API,主要是数组的创建方式和运算方式,由于相关内容跟 Numpy 比较相似,并且 Numpy 类型可以转 torch.Tensor,因此对 Numpy 感兴趣的读者可以参考笔者的其它文章:
郑子铭
2024/12/09
3010
使用 C# 入门深度学习:Pytorch 基础
PyTorch 2.2 中文官方教程(二)
介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 || 模型理解
ApacheCN_飞龙
2024/02/05
6580
PyTorch 2.2 中文官方教程(二)
PyTorch中Tensor的操作手册
默认下,Tensor为‘torch.FloatTensor’类型,若要改为double类型的,则需要执行
孔西皮
2023/10/18
6240
PyTorch中Tensor的操作手册
Python|张量创建操作[4]
返回一个一维的张量,使用对数,从start到end。比如在start处,值是10,base是2,那么start对应的值输出为2的10次方。参数
福贵
2020/05/27
7840
pytorch基础知识-tensor张量的创建 下
若使用rand_like的函数,torch.rand_like(a)表示接收的参数不再是shape,而是tensor类型。将上面的a的shape读出来后,再送给rand函数。
用户6719124
2019/11/17
9850
使用 C# 入门深度学习:Pytorch 基础
本文内容介绍 Pytorcn 的基础 API,主要是数组的创建方式和运算方式,由于相关内容跟 Numpy 比较相似,并且 Numpy 类型可以转 torch.Tensor,因此对 Numpy 感兴趣的读者可以参考笔者的其它文章:
痴者工良
2025/03/26
940
使用 C# 入门深度学习:Pytorch 基础
pytorch张量的创建
从torch.from_numpy创建的tensor于原ndarray共享内存,当修改其中一个数据,另一个也将会被改动。
@小森
2024/03/15
1390
pytorch张量的创建
Pytorch 的tensor (张量)的介绍
Tensor是Pytorch中最基本的一种数据抽象,它类似于C或numpy中的数组,可以有多个维度。张量也可以在GPU上使用以提高性能。
用户6021899
2022/04/15
2.3K0
【Pytorch】笔记一:数据载体张量与线性回归
疫情在家的这段时间,系统的学习一遍 Pytorch 基础知识,因为我发现虽然直接 Pytorch 实战上手比较快,但是关于一些内部的原理知识其实并不是太懂,这样学习起来感觉很不踏实, 对 Pytorch 的使用依然是模模糊糊, 跟着人家的代码用 Pytorch 玩神经网络还行,也能读懂,但自己亲手做的时候,直接无从下手,啥也想不起来, 我觉得我这种情况就不是对于某个程序练得不熟了,而是对 Pytorch 本身在自己的脑海根本没有形成一个概念框架,不知道它内部运行原理和逻辑,所以自己写的时候没法形成一个代码逻辑,就无从下手。这种情况即使背过人家这个程序,那也只是某个程序而已,不能说会 Pytorch, 并且这种背程序的思想本身就很可怕, 所以我还是习惯学习知识先有框架(至少先知道有啥东西)然后再通过实战(各个东西具体咋用)来填充这个框架。而「这个系列的目的就是在脑海中先建一个 Pytorch 的基本框架出来, 学习知识,知其然,知其所以然才更有意思」。
阿泽 Crz
2020/08/28
2.9K0
【Pytorch】笔记一:数据载体张量与线性回归
PyTorch简明笔记[1]-Tensor的初始化和基本操作
安装PyTorch应该不用我多说,他们的官网很人性化地给出了各种环境应该怎么安装,网址:https://pytorch.org/get-started/locally/
beyondGuo
2019/01/09
8.6K0
深度学习基础:1.张量的基本操作
注:张量默认创建int64(长整型)类型,整数型的数组默认创建int32(整型)类型。
zstar
2022/06/14
5K0
深度学习基础:1.张量的基本操作
PyTorch: 张量的变换、数学运算及线性回归
功能:2 维张量转置,对矩阵而言,等价于torch.transpose(input, 0, 1)
timerring
2022/11/12
1.1K0
PyTorch: 张量的变换、数学运算及线性回归
相关推荐
PyTorch从入门到放弃之张量模块
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档