代码改变世界

iOS开发系列-NSURLSession

2018-04-21 15:32  iCoderHong  阅读(180)  评论(0编辑  收藏  举报

概述

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__);
}