NSURLSession

  1 iOS 7:NSURLSession
  2         字面理解Session会话控制
  3         而Connection是连接,显然Session比这个Connection要更强大些
  4 
  5 一、NSURLSession简介(整体认知)
  6     (1).出现
  7 
  8     NSURLConnection作为一个网络基础架构,它已经表现得相当好。它是伴随着2003年Safari浏览器的原始发行版本诞生的,但是,这些年来,iPhone和iPad新兴的用例,特别是有一些已经向NSURLConnection的几个核心设想提出了挑战,对其重构已经迫在眉睫。
  9     在2013年的WWDC上,Apple揭开了NSURLConnection继任者的面纱:NSURLSession。
 10     PS:苹果全球开发者大会,英文全称是(Apple Worldwide Developers Conference)。简称为“WWDC”。
 11 
 12     (2).特点
 13     NSURLSession与咱们熟悉的NSURLConnection是并列的。在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作。注意,如果用户强制将程序关闭,NSURLSession会断掉。
 14 
 15     (3).NSURLSession提供的功能:
 16         1.通过URL将数据下载到内存
 17         2.通过URL将数据下载到文件系统
 18         3.将数据上传到指定URL
 19         4.在后台完成上述功能
 20 
 21     (4)NSURLSession带来了这些新的好处:
 22         后台上传和下载
 23         可以暂停和继续连接网络
 24         保存配置
 25         子类化和私有存储
 26         改良的认证处理
 27         丰富的代理模型
 28         通过文件系统上传和下载
 29 
 30 二、相关的类(组成部分)
 31     1.NSURLConnection这个名字,实际上指的是一组构成Foundation框架中URL加载系统的相互关联的组件:NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage,以及和它同名的NSURLConnection。
 32 
 33 
 34     2.NSURLSession也是一组相互依赖的类,它的大部分组件和NSURLConnection中的组件相同如NSURLRequest,NSURLCache等。而NSURLSession的不同之处在于,它将NSURLConnection替换为NSURLSession和NSURLSessionConfiguration,以及3个NSURLSessionTask的子类:NSURLSessionDataTask, NSURLSessionUploadTask, 和NSURLSessionDownloadTask。
 35 
 36     3.与NSURLConnection相比,NSURLSession最直接的改善就是提供了配置每个会话的缓存,协议,cookie和证书政策(credential policies),甚至跨应用程序共享它们的能力。这使得框架的网络基础架构和部分应用程序独立工作,而不会互相干扰。每一个NSURLSession对象都是根据一个NSURLSessionConfiguration初始化的,该NSURLSessionConfiguration指定了上面提到的政策,以及一系列为了提高移动设备性能而专门添加的新选项。
 37         PS:cookie(小甜饼?)指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密),好让服务器用来辨认你的计算机(自动登录、用户习惯和关注等)。
 38 
 39    4.NSURLSession的另一重要组成部分是会话任务,它负责处理数据的加载,以及客户端与服务器之间的文件和数据的上传下载服务。NSURLSessionTask与NSURLConnection是及其相似的,因为它负责加载数据,而主要的区别在于,任务共享它们父类NSURLSession的共同委托(common delegate)。
 40 
 41 
 42 
 43 三、NSURLSession新推出的类(详细认知)
 44     1.NSURLSessionConfiguration类
 45         其中NSURLSessionConfiguration用于配置会话的属性,可以通过该类配置会话的工作模式
 46         指定NSURLSession的配置信息。这些配置信息决定了NSURLSession的种类,HTTP的额外headers,请求的timeout时间,Cookie的接受策略等配置信息。更多的参见官方文档。
 47 
 48     2.NSURLSession类
 49         获取NSURLSession类对象有几种方式
 50         会话是基于NSURLSession网络开发的核心组件。由上文的Configuration来配置,然后作为工厂,创建NSURLSessionTask来进行实际的数据传输任务。
 51     3.NSURLSessionTask
 52         实际的Session任务,分为三种
 53         NSURLSessionTask是一个抽象类,它有三个具体的子类是可以直接使用的:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。这三个类封装了现代应用程序的三个基本网络任务:获取数据,比如JSON或XML,以及上传下载文件。
 54 
 55 
 56 
 57 四、工作流程
 58     利用NSURLSession进行数据传输我们需要:
 59     1.创建一个NSURLSessionConfiguration,用于第二步创建NSSession时设置工作模式和网络设置:
 60 
 61     工作模式分为:
 62         一般模式(default):工作模式类似于原来的NSURLConnection,可以使用缓存的Cache,Cookie,鉴权。
 63             + (NSURLSessionConfiguration *)defaultSessionConfiguration
 64             defaultSession,使用基于硬盘的持久话Cache,保存用户的证书到钥匙串,使用共享cookie存储
 65 
 66         即时模式(ephemeral):不使用缓存的Cache,Cookie,鉴权。
 67             + (NSURLSessionConfiguration *)ephemeralSessionConfiguration
 68             配置信息和default大致相同。除了,不会把cache,证书,或者任何和Session相关的数据存储到硬盘,而是存储在内存中,生命周期和Session一致。比如浏览器无痕浏览等功能就可以基于这个来做。
 69         后台模式(background):在后台完成上传下载,创建Configuration对象的时候需要给一个NSString的ID用于追踪完成工作的Session是哪一个(后面会讲到)。
 70             + (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier
 71             创建一个可以在后台甚至APP已经关闭的时候仍然在传输数据的会话。注意,后台Session一定要在创建的时候赋予一个唯一的identifier,这样在APP下次运行的时候,能够根据identifier来进行相关的区分。如果用户关闭了APP,IOS 系统会关闭所有的background Session。而且,被用户强制关闭了以后,IOS系统不会主动唤醒APP,只有用户下次启动了APP,数据传输才会继续。
 72 
 73     创建一个NSURLSession,系统提供了两个创建方法:
 74 
 75         sessionWithConfiguration:
 76             根据刚才创建的Configuration创建一个Session,系统默认创建一个新的OperationQueue处理Session的消息。
 77         sessionWithConfiguration:delegate:delegateQueue:
 78             可以设定回调的delegate(注意这个回调delegate会被强引用),并且可以设定delegate在哪个OperationQueue回调,如果我们将其设置为[NSOperationQueue mainQueue]就能在主线程进行回调非常的方便。
 79 
 80 
 81     2.创建一个NSURLRequest调用刚才的NSURLSession对象提供的Task函数,创建一个NSURLSessionTask。
 82 
 83     根据职能不同Task有三种子类:
 84     NSURLSessionUploadTask:上传用的Task,传完以后不会再下载返回结果;
 85     NSURLSessionDownloadTask:下载用的Task,下载内容到硬盘上;
 86     NSURLSessionDataTask:可以上传内容,上传完成后再进行下载,存储为NSData格式。
 87 
 88     得到的Task,调用resume开始工作。
 89 
 90 
 91     3.如果是细粒度的Session调用,Session与Delegate会在指定的OperationQueue中进行交互。
 92 
 93     4.当不再需要连接调用Session的invalidateAndCancel直接关闭,或者调用finishTasksAndInvalidate等待当前Task结束后关闭。这时Delegate会收到URLSession:didBecomeInvalidWithError:这个事件。Delegate收到这个事件之后会被解引用。
 94 
 95     5.如果是一个BackgroundSession,在Task执行的时候,用户切到后台,Session会和ApplicationDelegate做交互。当程序切到后台后,在BackgroundSession中的Task还会继续下载。
 96 
 97 五、详见代码
 98 
 99 
100 
101 六、拓展了解部分
102 
103     1.NSURLSession
104     会话是基于NSURLSession网络开发的核心组件。由上文的Configuration来配置,然后作为工厂,创建NSURLSessionTask来进行实际的数据传输任务。
105 
106     2.NSURLRequest
107     指定请求的URL和cache策略。
108     通过NSURLRequest可以设置HTTPMethod,默认是GET
109 
110     3.NSURLCache
111     cache URL请求返回的response。
112     //http://blog.sina.com.cn/s/blog_9693f61a01016t4w.html
113 
114     4.NSURLResponse/NSHTTPURLResponse
115     通过REST API进行资源操作的时候,有request(请求)必然就有response(响应)。NSURLResponse中包含了metadata,例如返回的数据长度(expectedContentLength),MIME 类型,text编码方式。
116 
117     5.NSURLCredential
118     - 用来处理证书信息
119     比如用户名密码,比如服务器授权等等。
120     这个要根据不同的认证方式来处理,
121     例如以下就是初始化一个用户名密码的认证。
122     //http://blog.csdn.net/majiakun1/article/details/17013379
123 
124     6.NSURLAuthenticationChallenge
125     在访问资源的时候,可能服务器会返回需要授权(提供一个NSURLCredential对象)。那么,URLSession:task:didReceiveChallenge:completionHandler:被调用。需要的授权信息会保存在这个类的对象里。
126 
127     7.NSURLProtectionSpace
128     这个类的对象代表了服务器上的一块需要授权信息的区域,英文叫realm。通过这个对象的信息来响应Challenge。
129     比如,如果服务器需要一个基于用户名密码的认证,那么应该先参考下NSURLProtectionSpace对象的host,port,realm,protocol等信息,然后依照这个信息提供证书。

 

posted @ 2015-08-31 20:58  海东青飞吧!  阅读(234)  评论(0编辑  收藏  举报