iOS开发·网络请求方法总结复习(下)

3. HTTPS与HTTP的不同点

前面涉及到的GET和POST都属于HTTP请求,现在苹果的APP都推荐支持HTTPS,这就需要先配置一下证书,然后在NSURLSession(或者NSURLConnection但现在新的项目基本不用了)的代理方法里面进行一些特别的操作。如果是AFNetWorking,也需要对AFHTTPRequestOperationManager对象进行一些特别的操作。

https://www.jianshu.com/p/97745be81d64

https://www.jianshu.com/p/459e5471e61b

https://www.jianshu.com/p/4f826c6e48ed

4. AF封装了GET和POST操作的 -- AFHTTPSessionManager

AFNetworking2.0和3.0区别很大,也是因为苹果废弃了NSURLConnection,而改用了NSURLSession,AFNetworking3.0实际上只是对NSURLSession所做的操作进行了高度封装,提供更加简洁的API供编码调用。

查看AFHTTPSessionManager.h文件,可知AFHTTPSessionManager是AFURLSessionManager的子类:

请求示例 -- 下载一个PDF文件

get请求调用栈分析

AFURLSessionManager.m

5. AF的GET和POST请求实现第二层 -- AFURLSessionManager

5.1 downloadTaskWithRequest: progress: destination: completionandler:

AFURLSessionManager.m

调用示例

DownloadVC.m

内部封装分析

AFURLSessionManager.m

其中self.session是AFURLSessionManager.h中的属性

它后面调用的API声明在NSFoundation的NSURLSession.h的头文件中

添加代理的封装

AFURLSessionManager.m

其中

其中,self.mutableTaskDelegatesKeyedByTaskIdentifier是个字典

被调用的地方在:

进而被调用的地方在:

5.2 dataTaskWithRequest: completionHandler:

说明:这个NSURLSession的API容易跟AFURLSessionManager的API混淆,参数都是一个request和一个handler block。

NSURLSession的API是这样的:

而AFURLSessionManager的API是这样的,可以对比学习下:

调用示例 -- dataTaskWithRequest:

DownloadVC.m

其中self.manager是懒加载得到的AFURLSessionManager

内部封装分析

AFURLSessionManager.m

6. 调用栈分析

初始化AFHTTPSessionManager的内部实现调用栈

AFHTTPSessionManager发送请求的内部实现调用栈

其中,【注解1】、【注解2】、【注解3】这三个方法得到的是同一个对象,即【注解3】中系统原生的NSURLSessionDataTask对象。所以,AF请求操作内部实现也是和原生NSURLSession操作一样,创建task,调用resume发送请求。

7. 开放问题:session与TCP连接数

请求的时候,NSURLSession的session跟TCP的个数是否有什么关系?有人说请求同域名且共享的session会复用同一个TCP链接,否则就不复用,就一个session一个TCP连接?

关于这块的知识可研究资料较少,且不可信,笔者日后研究到确定的答案后再更新。也欢迎读者留下自己的见解。

不过据我观察,可能没那么简单,新的iOS11系统新增了多路TCP即Multipath-TCP,因而也为NSURLSession和NSURLSessionConfiguration提供了新的属性multipathServiceType,以及HTTPMaximumConnectionsPerHost。下面是它们的定义:

NSURLSession.h

NSURLSession.h

NSURLSessionConfiguration.h

作者:陈满iOS

链接:https://www.jianshu.com/p/dee6a7ec8393

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180712B0CNME00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券