与网络相关的几个重要的类(一) —— NSURLSession(一)

版本记录

版本号 时间
V1.0 2018.01.09

前言

APP都需要与服务器进行数据交互,极个别的除外,比如简单的相机,计算器等等,不需要登录和服务端存储信息的APP,绝大多数都是需要和服务器进行交互的,那就需要用到网络,接下来几篇就讲述一下与网络相关的几个类。

Overview

该类作用是用来协调一组相关网络数据传输任务的对象。

NSURLSession类和相关类提供了用于下载内容的API。 此API提供了一组丰富的委托方法来支持身份验证,并使您的应用能够在应用未运行时或者暂停应用时执行后台下载。

NSURLSession类本地支持datafileftphttphttps URL schemes,透明地支持代理proxy服务器和SOCKS网关,如用户系统偏好设置中配置的那样。

NSURLSession支持HTTP / 1.1SPDYHTTP / 2协议。 HTTP / 2支持由RFC 7540描述,并需要支持ALPNNPN的服务器进行协议协商。

您还可以使用NSURLProtocol添加对自己的自定义网络协议和URL scheme的支持(用于您的app的私人使用)。

注意:NSURLSession API涉及许多不同的类以相当复杂的方式一起工作,如果您阅读参考文档,则这些类可能并不明显。 在使用这个API之前,你应该阅读 URL Session Programming Guide以便了解这些类如何相互交互。

使用NSURLSession API,您的app会创建一个或多个会话,每个会话都会协调一组相关的数据传输任务。 例如,如果您正在创建Web浏览器,则您的应用程序可以为每个tab或window创建一个会话,或者一个会话用于交互式使用,另一个用于后台下载。 在每个会话中,您的应用程序会添加一系列任务,其中每个任务代表对特定URL的请求(如果需要,请在HTTP redirects之后)。

给定的URL会话中的任务共享一个公共的会话配置对象session configuration object,该对象定义了连接行为,例如要对单个host进行的同时连接的最大数量,是否允许通过蜂窝网络的连接等等。 会话的行为部分由您在创建配置对象时调用的方法决定:

  • 单利共享会话singleton shared session(没有配置对象)用于基本请求。 它不像您创建的会话那样具有可定制性,但是如果您的要求非常有限,则它是一个很好的起点。 您可以通过调用sharedSession类方法来访问此会话。 有关其局限性的更多信息,请参阅该方法的讨论。

  • 默认会话Default sessions的行为与共享会话singleton shared session非常相似(除非您进一步自定义),但是可以使用代理逐步获取数据。 您可以通过调用NSURLSessionConfiguration类的defaultSessionConfiguration方法来创建默认的会话配置。

  • 临时会话Ephemeral sessions与默认会话default sessions类似,但不会将缓存cache,Cookiecredentials写入磁盘。 您可以通过调用NSURLSessionConfiguration类上的 ephemeralSessionConfiguration方法来创建临时会话配置。

  • 后台会话Background sessions允许您在应用程序未运行时在后台执行上传和下载内容。 您可以通过调用NSURLSessionConfigurationbackgroundSessionConfiguration:方法来创建后台会话配置。

会话配置session configuration对象还包含对URL缓存和Cookie存储对象的引用,这些对象可能在发出请求和处理响应时使用,具体取决于配置和请求类型。

会话中的任务还共享一个通用代理,以便在发生各种事件时提供和获取信息 - 当身份验证失败时,当数据从服务器到达时,当数据准备好被缓存时等等。 Using a URL Session一步一步地列出了会话执行任务时发生的事件,以及作为结果调用哪个代理方法。

另一方面,如果您不需要代理提供的任何功能,则可以在创建会话时通过传递nil来使用此API,而无需提供此功能。

重要:会话对象保持对代理的强引用,直到你的应用程序退出或显式使会话无效。 如果您不会使会话无效,那么您的应用程序会泄漏内存,直到退出。

在会话中,您可以创建任务,可选地将数据上载到服务器,然后从服务器检索数据(作为磁盘上的文件或内存中的一个或多个NSData对象)。 NSURLSession API提供了三种类型的任务:

  • Data tasks,数据任务使用NSData对象发送和接收数据。 数据任务旨在用于对服务器进行简短的交互式请求。

  • Upload tasks,上传任务与数据任务类似,但也会发送数据(通常以文件的形式),并在应用程序未运行时支持后台上传。

  • Download tasks,下载任务以文件的形式检索数据,并在应用程序不运行时支持后台下载和上传,。

像大多数网络API一样,NSURLSession API是高度异步的。 它以两种方式之一将数据返回到您的应用程序,具体取决于您调用的方法:

  • 当传输成功完成或发生错误时,通过调用完成处理程序块。

  • 当数据被接收并且传输完成时,通过在会话的代理中调用方法。

除了将这些信息传递给代理,NSURLSession API还提供状态status和进度progress属性,如果需要根据任务的当前状态做出编程决定(可以随时改变状态),可以查询状态和进度属性。

URL会话还支持取消,重新启动或恢复以及暂停任务,并提供恢复暂停,取消或失败下载的功能。


Related Classes - 相关的类

NSURLSession API使用许多类,这些类也常用于其他API,例如NSURLConnectionNSURLDownload。 其中一些共享类包括:

  • NSURL - 包含URL的一个对象。
  • NSURLRequest - 封装与URL请求有关的元数据,包括URL,请求方法等等。
  • NSURLResponse - 封装与服务器对请求的响应相关的元数据,例如内容MIME类型和长度。
  • NSHTTPURLResponse - 添加特定于HTTP请求的元数据,例如响应头。
  • NSCachedURLResponse - 封装URL响应对象,以及服务器响应的实际主体数据,以进行缓存。

App Transport Security (ATS)

iOS 9.0OS X 10.11开始,对于使用NSURLSession进行的所有HTTP连接,默认启用称为App Transport Security(ATS)的新安全功能。 ATS要求HTTP连接使用HTTPS(RFC 2818)。


Using a URL Session - 使用URL会话

使用NSURLSession类发出请求

    1. 创建会话配置。 对于后台会话,此配置必须包含唯一标识符。 存储该标识符,并在应用程序崩溃或终止或挂起时使用该标识符与会话重新关联。
    1. 创建一个会话,指定一个配置对象,还可以指定一个代理。
    1. 在会话中创建任务代表资源请求的任务对象。 这些任务对象是NSURLSessionTask—— NSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTask的子类,具体取决于您尝试实现的行为。 每个任务都以暂停suspended状态启动。 在您的应用程序调用恢复resume任务后,它开始下载指定的资源。

在你开始一个任务之后,会话在它的代理上调用方法

如果您的app取消正在进行的下载,则NSURLSession对象会像发生错误一样调用代理的 URLSession:task:didCompleteWithError:方法。


NSCopying Behavior - NSCopying行为

会话和任务对象遵循NSCopying协议如下:

  • 当您的app复制一个会话或任务对象时,你会得到相同的对象。
  • 当您的app复制一个配置对象时,您会得到一个您可以独立修改的新副本。

Thread Safety - 线程安全

URL会话API本身完全是线程安全的。 您可以在任何线程上下文中自由创建会话和任务,并且当您的代理方法调用提供的完成处理程序时,会自动在正确的代理队列上调度工作。

警告:您的 URLSessionDidFinishEventsForBackgroundURLSession:会话代理方法可能会在辅助线程上调用。 但是,在iOS中,您的该方法的实现可能需要调用在您的app中提供给您的完成处理程序: application:handleEventsForBackgroundURLSession:completionHandler:app代理方法。 您必须在主线程上调用完成处理程序。


Topics

1. Creating a Session

2. Configuring a Session

  • configuration

    • 此会话的配置对象的副本。
  • delegate

    • 创建此对象时分配的代理。
  • NSURLSessionDelegate

    • NSURLSessionDelegate协议描述NSURLSession对象在代理上调用以处理会话级事件的方法。
  • NSURLSessionTaskDelegate

    • NSURLSessionTaskDelegate协议定义了在使用任何类型的NSURLSession任务时应该实现的特定于任务的代理方法。
  • delegateQueue

    • 此对象创建时提供的操作队列
  • sessionDescription

    • 会话的应用程序定义的描述性标签。

3. Adding Data Tasks to a Session

4. Adding Download Tasks to a Session

5. Adding Upload Tasks to a Session

6. Adding Stream Tasks to a Session

7. Managing the Session

8. Constants

后记

未完,待续~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容