免费开源的iOS开发学习平台

iOS开发之网络编程:10-常用网络内部类之NSURLSession

NSURLSession是苹果在iOS7后为HTTP数据传输提供的一系列接口。NSURLConnection在iOS9被宣布弃用之后,苹果推荐我们使用的NSURLSession。

1、NSURLSession简介

  • 创建NSURLSession有两种方法:

获得共享的Session

+ (NSURLSession *)sharedSession;

自定义Session

+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id <NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue;
  • NSURLSessionConfiguration是session的配置信息类,它有三种类型:

1.默认的配置会将缓存存储在磁盘上

+ (NSURLSessionConfiguration *)defaultSessionConfiguration;

2.瞬时会话模式不会创建持久性存储的缓存

+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration;

3.后台会话模式允许程序在后台进行上传下载工作

+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier;
  • 使用NSURLSession主要有两个步骤:

    第一步:使用NSURLSession对象创建Task

    第二步:执行task

2、关于task

  • task有三种类型

NSURLSessionUploadTask:文件上传时使用。

NSURLSessionDownloadTask:文件下载时使用。

NSURLSessionDataTask:dataTask完全可以胜任downloadTask和uploadTask的工作.它也是我们使用最多的task种类。

  • task的常见方法:

让当前的任务暂停

- (void)suspend;

不仅可以启动任务,还可以唤醒suspend状态的任务

- (void)resume;

可以取消当前的任务,你也可以向处于suspend状态的任务发送cancel消息,任务如果被取消便不能再恢复到之前的状态

- (void)cancel;
  • 还分别有两个代理协议NSURLSessionDownloadDelegate和NSURLSessionDataDelegate,它们继承自NSURLSessionTaskDelegate,主要用来在接收数据过程中做进一步的处理。这里我们只做一个简单介绍。

NSURLSessionDataDelegate代理方法:

1.接收到服务器的响应

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler;

2.接收到服务器的数据(可能调用多次

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data;

3.请求成功或者失败(如果失败,error有值)

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error;

NSURLSessionDownloadDelegate代理方法:

1.每次写入调用(会调用多次)

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;

2.下载完成调用

- (void)URLSession:(NSURLSession *)session
      downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didFinishDownloadingToURL:(NSURL *)location;

3.任务完成调用

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error;