• IOS 开发 网络详解(十三) URLSesstion详解


    1.类结构

    2.NSURLSesstion

    session分为 :
    
    1.全局共享单例session : NSURLSession sharedSession, 有一定的局限性
    2.自定义session : 自定义配置文件, 设置代理, 大部分时间我们都是用这个
    3.后台session : 也是自定义session的一种, 只是他专门用于做后台上传
    /下载任务
    session为哪一种类型完全由其内部的Configuration而定.

    3.NSURLSesstionConfiguration

    配置分为 :
    
    defaultSessionConfiguration : 系统默认
    ephemeralSessionConfiguration : 仅内存缓存, 不做磁盘缓存的配置
    backgroundSessionConfiguration : 这里需要指定一个identifier, identifier用来后台重连session对象. (做后台上传/下载就是这个config)
    另外, 我们还可以给Configuration对象再自定义一些属性, 例如每端口的最大并发HTTP请求数目, 以及是否允许蜂窝网络, 请求缓存策略, 请求超时, cookies/证书存储策略等等

    4.NSURLSesstionDelegate

    session管理的一组tasks共享一个代理, 不想实现代理方法时, 代理传nil即可.
    代理协议分为 :
    
    NSURLSessionDelegate : session-level的代理方法
    NSURLSessionTaskDelegate : task-level面向all的代理方法
    NSURLSessionDataDelegate : task-level面向data和upload的代理方法
    NSURLSession​Download​Delegate : task-level的面向download的代理方法
    NSURLSessionStreamDelegate : task-level的面向stream的代理方法

    5.NSURLSesstionTask

    session task类型分为 :
    
    NSURLSessionTask : Task的抽象基类
    NSURLSessionDataTask : 以NSData的形式接收一个URLRequest的内容
    NSURLSessionUploadTask : 上传NSData或者本地磁盘中的文件, 完成后以NSData的形式接收一个URLRequest的响应
    NSURLSessionDownloadTask : 下载完成后返回临时文件在本地磁盘的URL路径
    NSURLSessionStreamTask : 用于建立一个TCP/IP连接

    6.使用

    //GET请求---dataTaskWithURL
    NSURLSessionTask *task = [session dataTaskWithURL:url
                                   completionHandler:^(NSData *data, NSURLResponse *response, NSError error) {
        NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];
    
    
    //POST请求---dataTaskWithRequest
    NSURLSessionTask *task = [session dataTaskWithRequest:request
                                       completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]); }];
    
    //下载请求---downloadTaskWithURL
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
        // location是沙盒中tmp文件夹下的一个临时url,文件下载后会存到这个位置,由于tmp中的文件随时可能被删除,所以我们需要自己需要把下载的文件挪到需要的地方
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
        // 剪切文件
        [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:path] error:nil];
    }];
    
    //上传请求---uploadTaskWithRequest
    NSURLSessionUploadTask *task =
    [[NSURLSession sharedSession] uploadTaskWithRequest:request
                                               fromFile:fileName
                                      completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    }];
    
    
    [task resume];

    7.NSURLSesstionDataDelegate

    // 1.接收到服务器的响应
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
        // 允许处理服务器的响应,才会继续接收服务器返回的数据
        completionHandler(NSURLSessionResponseAllow);
    }
    
    // 2.接收到服务器的数据(可能调用多次)
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
        // 处理每次接收的数据
    }
    
    // 3.请求成功或者失败(如果失败,error有值)
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
        // 请求完成,成功或者失败的处理
    }

    8.NSURLSesstionDownLoadDelegate

    // 每次写入调用(会调用多次)
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
         // 可在这里通过已写入的长度和总长度算出下载进度
         CGFloat progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite; 
    NSLog(@"%f",progress); } // 下载完成调用 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { // location还是一个临时路径,需要自己挪到需要的路径(caches下面) NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename]; [[NSFileManager defaultManager] moveItemAtURL:location toURL:[NSURL fileURLWithPath:filePath] error:nil]; } // 任务完成调用 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { }

    9.Task的自身方法

    - (void)suspend;
    - (void)resume;
    - (void)cancel;

    10.总结

    1.创建NSURLSessionConfig对象
    2.用之前创建的NSURLSessionConfig对象创建配置NSURLSession对象。
    3.用NSURLSession对象创建对应的task对象 并用resume方法执行之。
    4.用delegate方法或completion block 响应网络事件及数据
  • 相关阅读:
    BZOJ3779: 重组病毒
    BZOJ3112 [ZJOI2013]防守战线
    BZOJ4011 [HNOI2015]落忆枫音
    BZOJ2726 [SDOI2012]任务安排
    BZOJ1492 [NOI2007]货币兑换
    BZOJ1597 [USACO2008]土地购买
    BZOJ3611 [HEOI2014]大工程
    BZOJ3991 [SDOI2015]寻宝游戏
    BZOJ3675 [APIO2014]序列分割
    BZOJ1010 [HNOI2008]玩具装箱
  • 原文地址:https://www.cnblogs.com/guchengfengyun/p/8098298.html
Copyright © 2020-2023  润新知