1.前言
学习NSURLSession的使用之前,先学习一篇关于NSURLSession的好文章From NSURLConnection to NSURLSession或者是国内的译文《从 NSURLConnection 到 NSURLSession》,或者不用学习本人的博客园笔记直接学习《从 NSURLConnection 到 NSURLSession》也是可以的,这篇对NSURLSession的使用有着挺详细的论述。但是本文先粗略介绍一下NSURLSession的基础和基本的网络请求使用,以备本人遗忘复习之用😏👻。
1.NSURLConnection的理论:
1.NSURLConnection 作为 Core Foundation / CFNetwork 框架的 API 之上的一个抽象.
在 2003 年,随着第一版的 Safari 的发布就发布了NSURLConnection 这个名字:
实际上是指代的 Foundation 框架的 URL 加载系统中一系列有关联的组件:
NSURLRequest、NSURLResponse、NSURLProtocol、 NSURLCache、
NSHTTPCookieStorage、NSURLCredentialStorage
以及同名类 NSURLConnection。
2.NSURLRequest 被传递给 NSURLConnection。被委托对象
(遵守以前的非正式协议 <NSURLConnectionDelegate> 和 <NSURLConnectionDataDelegate>)
异步地返回一个 NSURLResponse 以及包含服务器返回信息的 NSData。
在一个请求被发送到服务器之前,系统会先查询共享的缓存信息,然后根据策略(policy)以及可用性(availability)的不同,
一个已经被缓存的响应可能会被立即返回。如果没有缓存的响应可用,则这个请求将根据我们指定的策略来缓存它的响应以便将来的请求可以使用。
3.在把请求发送给服务器的过程中,服务器可能会发出鉴权查询(authentication challenge)
这可以由共享的 cookie 或机密存储(credential storage)来自动响应,或者由被委托对象来响应。
发送中的请求也可以被注册的 NSURLProtocol 对象所拦截,以便在必要的时候无缝地改变其加载行为。
3.不管怎样,NSURLConnection 作为网络基础架构,已经服务了成千上万的 iOS 和 Mac OS 程序,并且做的还算相当不错。
但是这些年,一些用例——尤其是在 iPhone 和 iPad 上面——已经对 NSURLConnection 的几个核心概念提出了挑战,让苹果有理由对它进行重构
2.NSURLSession的理论:
1.NSURLSession 指的也不仅是同名类 NSURLSession,还包括一系列相互关联的类。
NSURLSession 包括了与之前相同的组件,NSURLRequest 与 NSURLCache,
但是把 NSURLConnection 替换成了
NSURLSession、NSURLSessionConfiguration 以及 NSURLSessionTask 的 3 个子类:
NSURLSessionDataTask,NSURLSessionUploadTask,NSURLSessionDownloadTask。
2.与 NSURLConnection 相比,NSURLsession 最直接的改进就是可以配置每个 session 的缓存,协议,cookie,以及证书策略(credential policy),
甚至跨程序共享这些信息。这将允许程序和网络基础框架之间相互独立,不会发生干扰。
每个 NSURLSession 对象都由一个 NSURLSessionConfiguration 对象来进行初始化,后者指定了刚才提到的那些策略以及一些用来增强移动设备上性能的新选项。
3.NSURLSession 中另一大块就是 session task。
它负责处理数据的加载以及文件和数据在客户端与服务端之间的上传和下载。
NSURLSessionTask 与 NSURLConnection 最大的相似之处在于它也负责数据的加载,
最大的不同之处在于所有的 task 共享其创造者 NSURLSession 这一公共委托者(common delegate)。
4.了解NSURLSessionTask:
主要的代码知识:
NSURLSession:
- (NSURLSessionDataTask)dataTaskWithRequest 根据请求对象创建任务
- (NSURLSessionDataTask)dataTaskWithURL 根据请求的URL创建任务
NSURLSessionDataTask:
- (void)resume 开始执行任务