iOS NSURLSession
NSURLSession
是iOS7
中新的网络接口,负责处理数据的加载以及文件和数据在客户端与服务端之间的上传和下载。本文将从以下几个方面介绍:
- NSURLSessionConfiguration:在使用
NSURLSession
首先要创建一个NSURLSessionConfiguration
来配置我们的NSURLSession
- NSURLSession
- NSURLSessionTask:
- NSURLSessionDataTask:处理一般的 NSData 数据对象,比如通过GET或POST方式从服务器获取JSON或XML返回等等,但不支持后台获取
- NSURLSessionUploadTask:用于上传文件,支持后台上传
- NSURLSessionDownloadTask:用于下载文件,支持后台下载
NSURLSessionConfiguration
一个NSURLSessionConfiguration
对象定义了当使用NSURLSession
对象上传和下载数据时的行为和使用策略。当你需要上传和下载数据时,创建一个配置对象总是你必须采取的第一步。从指定可用网络,到 cookie,安全性,缓存策略,再到使用自定义协议,启动事件的设置,以及用于移动设备优化的几个新属性,你会发现使用 NSURLSessionConfiguration
可以找到几乎任何你想要进行配置的选项。
NSURLSession
在初始化时会把配置它的NSURLSessionConfiguration
对象进行一次 copy,并保存到自己的configuration
属性中,而且这个属性是只读的。因此之后再修改最初配置session
的那个configuration
对象对于session
是没有影响的。也就是说,configuration
只在初始化时被读取一次,之后都是不会变化的。
NSURLSessionConfiguration
提供了三个工厂方法来创建我们的Session Configuration
对象:
+ defaultSessionConfiguration
:该方法返回创建的一个默认Session Configuration
对象。默认的Session Configuration
会使用磁盘来缓存数据并在用户的keychain
中存储凭证。它同样会存储cookie
。+ ephemeralSessionConfiguration
:返回一个session configuration
,且不会使用缓存,cookie
和凭证。使用ephemeral sessions
主要的优点就是隐私。因此,它可以用于实现像秘密浏览这种功能。+ backgroundSessionConfigurationWithIdentifier:
:返回一个后台的session configuration
。后台session
不同于常规的,普通的session
,它甚至可以在应用程序挂起,退出或者崩溃的情况下运行上传和下载任务。初始化时指定的标识符,被用于向任何可能在进程外恢复后台传输的守护进程(daemon)提供上下文。
对于NSURLSessionConfiguration
的属性配置,可以看这篇文章:http://objccn.io/issue-5-4/。
NSURLSession
创建好了NSURLSessionConfiguration
对象,我们就可以使用它来创建我们的NSURLSession
对象了。NSURLSession
提供了三个工厂方法来创建我们的session
对象:
+ sessionWithConfiguration:
:使用指定的session configuration
来创建一个session
,且会创建一个序列的NSOperationQueue
对象来处理所有的委托方法和完成处理程序的调用+ sessionWithConfiguration:delegate:delegateQueue:
:使用指定的session configuration
、delegate
和operation queue.
来创建session
。这个方法可以更细粒度的创建session
,可以设定回调的delegate
(注意这个回调delegate会被强引用),并且可以设定delegate
在哪个OperationQueue
回调,如果我们将其设置为[NSOperationQueue mainQueue]
就能在主线程进行回调非常的方便。+ sharedSession
:返回一个共享的单例session
对象
NSURLSessionTask
通过上面创建的session
,我们就可以安排三种类型的任务:检索数据到存储器的数据任务、下载文件到硬盘的下载任务和从硬盘上传文件的上传任务。
NSURLSessionTask
是一个抽象类,其下有 3 个实体子类可以直接使用:NSURLSessionDataTask
、NSURLSessionUploadTask
、NSURLSessionDownloadTask
。这 3 个子类封装了现代程序三个最基本的网络任务:获取数据,比如 JSON 或者 XML,上传文件和下载文件。
所有的task
都是可以取消,暂停或者恢复的。当一个 download task 取消时,可以通过选项来创建一个恢复数据(resume data),然后可以传递给下一次新创建的download task
,以便继续之前的下载。
这里的task
不同于其他的alloc-init
初始化方法,它是需要通过session
来创建的,NSURLSession
提供了多个方法来创建task
:
Data Task:
- dataTaskWithURL:
- dataTaskWithURL:completionHandler:
- dataTaskWithRequest:
- dataTaskWithRequest:completionHandler:
实例:
1 | NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; |
Download Task:
- downloadTaskWithURL:
- downloadTaskWithURL:completionHandler:
- downloadTaskWithRequest:
- downloadTaskWithRequest:completionHandler:
- downloadTaskWithResumeData:
- downloadTaskWithResumeData:completionHandler:
实例:
1 | NSURL *URL = [NSURL URLWithString:@"http://example.com/file.zip"]; |
Upload Task:
- uploadTaskWithRequest:fromData:
- uploadTaskWithRequest:fromData:completionHandler:
- uploadTaskWithRequest:fromFile:
- uploadTaskWithRequest:fromFile:completionHandler:
- uploadTaskWithStreamedRequest:
实例:
1 | NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; |
以上就是本文的全部内容啦。如有不对还请指出。