NSURLSession -- 备忘

Posted Alex_sun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSURLSession -- 备忘相关的知识,希望对你有一定的参考价值。

NSURLSession

NSURLSession是ios7出的API,在它之前常用的原生网络库是NSURLConnection,但是因为Connection的使用起来不是很方便 所以我们一直倾向于AFNetworking,AFNetworking的确非常强大 但是我们也不该遗忘NSURLSession 因为NSURLSession使用起来也很方便。

NSURLSession的三种工作模式:

  • 默认会话模式:这个模式是使用磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。
  • 瞬时会话模式:这个模式不使用磁盘缓存任何数据,所有的缓存,证书,cookie等都是保存在RAM中的,所以当程序退出时 这些缓存会被清理掉。
  • 后台会话模式:这个模式在后台完成上传下载功能,需要创建Configuration对象

NSURLSession的三种任务:

  • 请求数据任务
  • 上传文件任务
  • 下载文件任务

 

配置类:NSURLSessionConfiguration

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.allowsCellularAccess = true
configuration.discretionary = true
configuration.timeoutIntervalForRequest = 30.0
configuration.timeoutIntervalForResource = 60.0
configuration.HTTPAdditionalHeaders = ["Accept" : "application/json"]
configuration.HTTPMaximumConnectionsPerHost = 5

 初始化类方法:

  • NSURLSessionConfiguration.defaultSessionConfiguration():默认工作模式
  • NSURLSessionConfiguration.ephemeralSessionConfiguration():瞬时工作模式
  • NSURLSessionConfiguration.backgroundSessionConfiguration(identifier: String):后台工作模式(iOS7)
  • NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(identifier: String):后台工作模式(iOS8)

常用属性:

  • allowsCellularAccess:是否允许使用蜂窝网络连接。
  • discretionary:是否允许自由配置,当设置为true的时候 由系统选择最佳的网络连接。在上传和下载任务的时候建议设置为true 因为系统会使用最优的模式进行任务(把WiFi和电量考虑在内)。
  • timeoutIntervalForRequest:规定请求超时时间,如果请求在规定时间内没有被发出,就会超时。
  • timeoutIntervalForResource:规定请求超时时间,如果在指定时间内无法找到请求的资源时,就会超时。
  • HTTPAdditionalHeaders:设置额外的请求头配置。
  • HTTPMaximumConnectionsPerHost:限制最大的网络连接数量

 

NSURLSession

let session = NSURLSession.sharedSession()
let session = NSURLSession(configuration: configuration)
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue())

 三个初始化方法:

  • NSURLSession.sharedSession():获取全局共享的会话,将使用全局的缓存,cookie和证书。
  • NSURLSession(configuration: configuration):通过配置对象创建一个session类。
  • NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue()):和第二个方法类似,额外设置了代理和代理线程来相应各种事件

 

NSURLSessionTask

NSURLSessionTask是抽象类,一般使用的是它的三个子类:

  • NSURLSessionDataTask:最常用,获取json数据。
  • NSURLSessionUploadTask:主要用于上传文件。
  • NSURLSessionDownloadTask:主要用于下载文件。

 

NSURLSessionDataTask

通过URL创建

let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue())
        
        let url = NSURL(string: "some request path")
        let task = session.dataTaskWithURL(url!)
/* -------------------------------分割线------------------------------- */
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue()) let url = NSURL(string: "some request path") let task = session.dataTaskWithURL(url!) { (data, response, error) in // 请求后操作 }

通过URLRequest创建

        let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue())
        let url = NSURL(string: "some request path")
        let request = NSURLRequest(URL: url!)
        let task = session.dataTaskWithRequest(request)
        
        
        /* -------------------------------分割线------------------------------- */

let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue()) let url = NSURL(string: "some request path") let request = NSURLRequest(URL: url!) let task = session.dataTaskWithRequest(request) { (data, response, error) in // 请求完成操作

 

NSURLSessionUploadTask

        let task = session.uploadTaskWithStreamedRequest(request)
        let task = session.uploadTaskWithRequest(request, fromData: someData)
        let task = session.uploadTaskWithRequest(request, fromFile: fileUrl)
        let task = session.uploadTaskWithRequest(request, fromData: someData) { (data, response, error) in
            // 上传完成操作
        }
        let task = session.uploadTaskWithRequest(request, fromFile: fileUrl) { (data, response, error) in
            // 上传完成操作
        }

 

 

NSURLSessionDownloadTask

 通过URLRequest创建

 

        let downloadTask = session.downloadTaskWithRequest(request)
        let downloadTask = session.downloadTaskWithRequest(request) { (url, response, error) in
            // 下载完成操作
        }

 

 通过URL创建

 

        let downloadTask = session.downloadTaskWithURL(url!)
        let downloadTask = session.downloadTaskWithURL(url!) { (url, response, error) in
            // 下载完成操作
        }

 

 继续下载

        let downloadTask = session.downloadTaskWithResumeData(resumeData)
        let downloadTask = session.downloadTaskWithResumeData(resumeData) { (url, response, error) in
            // 下载完成操作
        }

 

以上是关于NSURLSession -- 备忘的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 布局备忘录

NSURLSession 断点下载

常用python日期日志获取内容循环的代码片段

上传 NSURLSession 配置为 backgroundSessionConfiguration 的文件后是不是可以运行代码

NSURLSession 错误域 = NSPOSIXErrorDomain 代码 = 2 “没有这样的文件或目录”

几个关于js数组方法reduce的经典片段