代码改变世界

iOS开发系列-NSURLSession

2018-04-21 15:32  iCoderHong  阅读(186)  评论(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__);
}
编辑推荐:
· 我在厂里搞 wine 的日子
· 如何通过向量化技术比较两段文本是否相似?
· 35+程序员的转型之路:经济寒冬中的希望与策略
· JavaScript中如何遍历对象?
· 领域模型应用
阅读排行:
· 独立项目运营一周年经验分享
· 一款开源免费、通用的 WPF 主题控件包
· 独立开发,这条路可行吗?
· 【定时任务核心】究竟是谁在负责盯着时间,并在恰当时机触发任务?
· 解决了AI聊天的10个痛点后,我又做了一个新功能:交叉分析表
点击右上角即可分享
微信分享提示