NSURLSession的使用

首先讲一些概念: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得委托和委托所处的

队列 当不需要连接时,可通过sessioninvalidataAndCancel

直接关闭 或者通过调用finishTasksAndInvalidate等待

当前的task结束后关闭 这时delegate会收到URLSession:didBecomeInvalidWithError

这个事件 delegate收到这个事件后会被自动解引用

 let session2 = NSURLSession(configuration: config1, delegate: self, delegateQueue: nil)

NSURLSessionTask类

其有三个子类 NSURLSeesionDataTask NSURLSessionUploadTask和NSURLSessionDownLoadTask

这三个类封装了现代应用程序的三个基本任务 获取数据(比如json或xml) 以及上传和下载文件

NSURLSession的使用_第1张图片

创建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
            
        }

 nsurlsessionUploadtask 通过request创建 在上传时指定文件源或者数据源 闭包表示上传好之后的一些操作

      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:(成功或者失败都会调用)方法做处理,以上的回调代码块可以在这里调用。








你可能感兴趣的:(NSURLSession的使用)