iOS开发系列-NSURLSession
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发系列-NSURLSession相关的知识,希望对你有一定的参考价值。
概述
NSURLSession是从ios7开始出现的。NSURLSession比NSURLConnection简单很多并且避免了很多坑,因此目前公司项目大部分由NSURLConnection过度为NSURLSession。
NSURLSession是一个抽象类。具体使用步骤:使用NSURLSession 对象创建Task,然后执行Task。
Task的类型分为NSURLSessionDataTask、NSURLSessionDownloadTask、NSURLSessionUploadTask。
NSURLSession发送请求
首先获取session实例
@property (class, readonly, strong) NSURLSession *sharedSession;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
如果需要一些session的配置,使用第二个方法。常见的设置
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.timeoutIntervalForRequest = 10.0; // 设置超时时间
config.allowsCellularAccess = YES; // 是否允许蜂窝网络(手机自带网络)
通过这个config创建的session发送网络都具备这个配置。
通过session创建Task
// NSURLSessionDataTask
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
// NSURLSessionDownloadTask
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
// NSURLSessionUploadTask
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(nullable NSData *)bodyData completionHandler:(void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))completionHandler;
主要两种方式获取Task。如果只是简单的请求直接传递URL,内部会封装成一个request。Block回调是子线程。
执行Task 发送请求
- (void)resume;
NSURLSession的代理方法发送请求
NSURLSession实例没有delegate属性,需要在NSURLSession初始化的时候设置代理
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURL *url = [NSURL URLWithString:@"http://img.zcool.cn/community/0142135541fe180000019ae9b8cf86.jpg@1280w_1l_2o_100sh.png"];
NSURLSessionDataTask *task = [session dataTaskWithURL:url];
[task resume];
代理方法
#pragma mark - NSURLSessionDataDelegate
// 接受到服务的响应
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
/**
NSURLSessionResponseCancel = 0,
NSURLSessionResponseAllow = 1,
NSURLSessionResponseBecomeDownload = 2,
NSURLSessionResponseBecomeStream
*/
// 运行处理服务器返回的数据 才会继续接受服务器返回的数据 默认是 NSURLSessionResponseCancel
completionHandler(NSURLSessionResponseAllow);
NSLog(@"------------%s", __func__);
}
// 接受到服务响应数据 可能或调用多次
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
NSLog(@"------------%s", __func__);
}
// 完成跟失败都会来到这个代理方法
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
NSLog(@"------------%s", __func__);
}
以上是关于iOS开发系列-NSURLSession的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发网络篇—发送GET和POST请求(使用NSURLSession)