zoukankan      html  css  js  c++  java
  • 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等信息,然后依照这个信息提供证书。
  • 相关阅读:
    第二代:晶体管计算机
    第一代计算机
    Android应用在不同版本间兼容性处理
    eventBus
    realm
    ijkplayer详解AAA
    USB 3.0规范中译本 第3章 USB 3.0体系结构概览
    ES6 学习笔记
    07_通过上下文获取常见目录
    06_登陆案例保存信息完成
  • 原文地址:https://www.cnblogs.com/sdutmyj/p/4774102.html
Copyright © 2011-2022 走看看