zoukankan      html  css  js  c++  java
  • 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__);
    }
    
  • 相关阅读:
    Uipath-Close Application和Close Window区别
    我与某猪同学斗智斗勇的那些事
    可视报表(Project)
    自定义函数(Power Query 之 M 语言)
    报表(Project)
    拆分…Split…(Power Query 之 M 语言)
    参加Mos考试
    主要视图展示(Project)
    听听文档(视频)-Power Pivot
    突出显示(Project)
  • 原文地址:https://www.cnblogs.com/CoderHong/p/8901698.html
Copyright © 2011-2022 走看看