回顾
上篇文章《第三方框架 | AFNetworking源码解析(3) 请求过程》介绍了AFNetworking 实现请求的过程,即创建和运行 NSURLSessionTask
的过程。这篇暂时不分析 AFNetworking 源码,而是学习下系统网络请求框架 URL Loading System 中涉及到的重要的类:NSURLSession
,NSURLSessionTask
,NSURLSessionConfiguration
等。
URL加载系统使用标准协议(如https或您创建的自定义协议)提供对URL标识的资源的访问。加载是异步执行的,因此应用程序可以保持响应,并在传入数据或错误到达时处理它们。
你可以用 NSURLSession 实例创建一个或多个 NSURLSessionTask
实例,它可以获取和返回数据到你的 APP,下载文件或上传文件到远程位置。 你可以通过 NSURLSessionConfiguration
对象来配置一个 session,该对象控制如何使用缓存和cookie等行为,或者是否允许在蜂窝网络上连接。
每个 session 都与一个委托相关联,以接收定期更新(或错误)。默认委托调用您提供的完成处理程序块;如果您选择提供自己的自定义委托,则不会调用此块。
您可以将会话配置为在后台运行,这样当应用程序暂停时,系统可以代表它下载数据并唤醒应用程序以交付结果。
对于与远程服务器的小型交互,可以使用 NSURLSessionDataTask
类将响应数据接收到内存中(与使用 NSURLSessionDownloadTask
类相反,后者将数据直接存储到文件系统中)。对于调用web服务端点等用途,数据任务非常理想。
使用URL会话实例创建任务。如果您的需求相当简单,您可以使用 NSURLSession
类的 sharedSession
实例。如果希望通过委托回调与传输进行交互,则需要创建一个会话,而不是使用共享实例。在创建会话时使用一个 NSURLSessionConfiguration
实例,同时传递一个实现 NSURLSessionDelegate
或其子协议之一的类。可以重用会话来创建多个任务,因此对于需要的每个惟一配置,创建会话并将其存储为属性。
注意:小心不要创建超出您需要的会话。例如,如果应用程序中有几个部分需要类似配置的会话,那么创建一个会话并在其中共享。
一旦有了会话,就使用 dataTask()
方法之一创建数据任务。任务在暂停状态下创建,可以通过调用 resume
启动。
获取数据的最简单方法是创建一个使用完成处理程序的数据任务。通过这种安排,任务将服务器的响应、数据和可能的错误交付给您提供的完成处理程序块。图1显示了会话和任务之间的关系,以及如何将结果交付给完成处理程序。
要创建使用完成处理程序的数据任务,请调用 URLSession
的 dataTaskWithURL:
方法。你的完成处理程序需要做三件事:
- 验证错误参数为nil。如果不是,则发生传输错误;处理错误并退出。
- 检查响应参数,以验证状态码表示成功,MIME类型是一个期望值。如果没有,则处理服务器错误并退出。
- 根据需要使用数据实例。