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;