首先讲一些概念:cookie:指某些网站为了辨别用户的身份,进行session跟踪从而储存在用户本地终端上得数据 可以叫做浏览器缓存
近些天老是在看NSURLSession这个与网络编程息息相关的类 总是没有好好的整理,现在就好好的整理一番
三种工作模式
默认会话模式(default) 工作模式类似于原来的NSURLConnection 使用的是基于磁盘的缓存持久化战略,使用用户keychain中保存的证书进行认证授权
瞬时会话模式(ephemeral)该模式不适用磁盘保存任何数据,所有和会话相关的chahe 证书 cookies等都被保存在RAM中,因此当会话退出时,这些保存的数据也将会消失
后台会话模式(background) 该模式在后台完成上传和下载,在创建configuration对象的时候需要提供一个NSSstring 类型的ID 用于进行表示
NSURLsession支持的三种任务
加载数据 上传和下载
iOS9中只支持NSURLsession相关的类了
它由NSURLsession 和NSURLSessionConfiguration和3个task dataTask 和 uploadtask还有
downloadtask
先说一下新推出的类
nsurlconfiguration类
配置会话的属性 可以通过该类配置会话的工作模式
//默认 let config = NSURLSessionConfiguration.defaultSessionConfiguration() //最不推荐 let config1 = NSURLSessionConfiguration.ephemeralSessionConfiguration() //后台 要有一个id 用于标记 let config2 = NSURLSessionConfiguration.backgroundSessionConfiguration("id")
*allowsCellularAccess属性指定是否允许
蜂窝链接,discretionary属性为true的时候表明
程序在后台时由系统自己选择最佳的网络配置
该属性可以节省通过蜂窝的宽带 在使用后台传输数据的时候,
建议使用discretionary属性 而不是allowscelluraraccess属性
因为他会把wifi和电源可用性考虑在内
config.allowsCellularAccess = false config.discretionary = true
获取NSURLSession得类有以下几种方法
第一种方法是采用静态的sharedSession方法
该类使用共享的会话 该会话使用全局的cache cookie和证书
let session = NSURLSession.sharedSession()
第二种方法是采用sessionwithconfiguration方法创建对象
也就是创建对应配置的会话
let session1 = NSURLSession(configuration: config)
第三种方法是通过sessionWhthConfigutation:delegate:delegateQueue
的方法 二三两种方法可以创建一个新会话并且定制
其会话类型 该方式自定了session得委托和委托所处的
队列 当不需要连接时,可通过session的invalidataAndCancel
直接关闭 或者通过调用finishTasksAndInvalidate等待
当前的task结束后关闭 这时delegate会收到URLSession:didBecomeInvalidWithError
这个事件 delegate收到这个事件后会被自动解引用
let session2 = NSURLSession(configuration: config1, delegate: self, delegateQueue: nil)
其有三个子类 NSURLSeesionDataTask NSURLSessionUploadTask和NSURLSessionDownLoadTask
这三个类封装了现代应用程序的三个基本任务 获取数据(比如json或xml) 以及上传和下载文件
创建NSURLSessionDataTask对象 可以通过 request 或者url创建 后面的闭包表示在加载完成之后的一些操作
let url = NSURL(string: "http://baidu.com") let request = NSMutableURLRequest(URL: url!) let task = session.dataTaskWithRequest(NSURLRequest) { (data , response, error) -> Void in } let task1 = session.dataTaskWithRequest(request) let task2 = session.dataTaskWithURL(url!) let task3 = session.dataTaskWithURL(url) { (data, response, error ) -> Void in }
let data:NSData? let uploadTask1 = session.uploadTaskWithRequest(request, fromData:data ) let uploadTask2 = session.uploadTaskWithRequest(request, fromData: <#T##NSData?#>) { (<#NSData?#>, <#NSURLResponse?#>, <#NSError?#>) -> Void in <#code#> } let uploadTask3 = session.uploadTaskWithRequest(request, fromFile: <#T##NSURL#>) let uoloadTask4 = session.uploadTaskWithRequest(<#T##request: NSURLRequest##NSURLRequest#>, fromFile: <#T##NSURL#>, completionHandler: <#T##(NSData?, NSURLResponse?, NSError?) -> Void#>) }nsurlsessiondownloaddask 下载任务可通过url 或者request 或者数据源来下载 系在任务支持断点下载
let downloadTask1 = session.downloadTaskWithURL(url) { (<#NSURL?#>, <#NSURLResponse?#>, <#NSError?#>) -> Void in <#code#> } let downloadTask2 = session.downloadTaskWithResumeData(<#T##resumeData: NSData##NSData#>, completionHandler: <#T##(NSURL?, NSURLResponse?, NSError?) -> Void#>) let downloadTask3 = session.downloadTaskWithRequest(<#T##request: NSURLRequest##NSURLRequest#>, completionHandler: <#T##(NSURL?, NSURLResponse?, NSError?) -> Void#>) }nsurlsessiondelegate和nsurlsessiontaskdelegate西医
在协议中可以完成各种各样的回调动作 例如身份认证 完成任务后的操作
错误处理和后台任务完成的动作,委托方法指定在NSURLSession中一定数量的字节传输使用
int64_t类型的参数
合作使用的ApplicationDelegate方法:
func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) { }
将任务切换到后台之后,Session的Delegate不会再收到和Task相关的消息。当所有Task全都完成后,程序将被唤醒,并调用ApplicationDelegate的application:handleEventsForBackgroundURLSession:completionHandler:回调,在这里要为后台session(由background session的identifier标识)指定对应的回调代码块。
随后,对于每一个完成的后台Task调用该Session的Delegate中的URLSession:downloadTask:didFinishDownloadingToURL:(成功的话)和URLSession:task:didCompleteWithError:(成功或者失败都会调用)方法做处理,以上的回调代码块可以在这里调用。