zoukankan      html  css  js  c++  java
  • iOS网络-03-NSURLSession与NSURLSessionTask

    简介


    • NSURLSession也能完成网络请求
    • NSURLConnection在iOS9中不推荐使用,NSURLSession是iOS9中推荐使用的网络请求方式
    • NSURLSession需要与NSURLSessionTask配合使用
    • NSURLSession的简单使用步骤
      • 创建请求任务
      • 执行请求任务
    • 通常使用NSURLSessionTask的子类来创建任务

    NSURLSession


    • NSURLSession对象的获取方法
      • 获取全局的NSURLSession对象(无法设置代理

        + (NSURLSession *)sharedSession
        
      • 通过NSURLSessionConfiguration获取(可以设置代理),NSURLSessionConfiguration类通常用来设置一些请求参数

        + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue
        

    NSURLSessionTask


    • 常用的属性
      • taskIdentifier(NSUInteger, readonly),任务标识,唯一确定一个任务
      • originalRequest(NSURLRequest *, readonly),上一个请求对象
      • currentRequest(NSURLRequest *, readonly),当前请求对象
      • response(NSURLResponse *, readonly),服务器的响应数据
      • countOfBytesReceived(int64_t, readonly),已经接收到的数据量
      • countOfBytesExpectedToReceive(int64_t, readonly),所要接收到的总数据量
      • countOfBytesSent(int64_t, readonly),已经发送的数据量
      • countOfBytesExpectedToSend(int64_t, readonly),所要发送的总数据量
      • taskDescription(NSString *),任务描述
      • state(NSURLSessionTaskState, readonly),任务的状态
      • error(NSError *, readonly),错误信息
      • priority(float),任务的优先级
    • 常用的方法(任务的状态控制)
      • - (void)cancel,取消任务
      • - (void)suspend,暂停任务
      • - (void)resume,继续任务
    • 任务优先级属性priority的取值
      • NSURLSessionTaskPriorityDefault
      • NSURLSessionTaskPriorityLow
      • NSURLSessionTaskPriorityHigh
    • NSURLSessionTask
      • NSURLSessionDataTask,该子类没有扩充属性和方法,只是为了与NSURLSessionUploadTask和NSURLSessionDownloadTask区分

      • NSURLSessionUploadTask,用于上传任务

      • NSURLSessionDownloadTask,提供了一个取消任务的方法,但是会保存用于以后继续任务的信息,方法如下:

        - (void)cancelByProducingResumeData:(void (^)(NSData * __nullable resumeData))completionHandler;
        

    与NSURLSession相关的代理协议


    • NSURLSessionDelegate
    • NSURLSessionTaskDelegate,遵守NSURLSessionDelegate协议
    • NSURLSessionDataDelegate,遵守NSURLSessionTaskDelegate协议,是网络请求通常遵循的协议,常用的方法:
      • 接受到服务响应时调用的方法

        - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
        /**
        * 必须在该方法中对服务器的响应进行授权,才能继续接收服务器返回的数据,调用如下函数
        * completionHandler(NSURLSessionResponseAllow)
        */
        
      • 接收到服务器返回的数据时调用的方法

        - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
        /**
        * data:服务返回的数据,通常为JSON格式数据
        */
        
      • 请求完成时调用的方法(成功或失败)

        - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error
        /**
        * 若出现错误,error中存放错误信息
        */
        
    • NSURLSessionDownloadDelegate(通常用于下载大量数据),遵守NSURLSessionTaskDelegate协议,常用的方法:
      • 写入数据到临时文件时调用的方法(服务器返回一点就写入一点)

        - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
        /**
        * totalBytesWritten,已写入数据的总长度
        * totalBytesExpectedToWrite:总共要写入数据的总长度
        * 可以在该方法中计算下载进度
        */
        
      • 遇到错误的时候调用

        - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
        /**
        *error:若遇到错误,则保存错误信息
        */
        
      • 用于断点下载的方法

        - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
        /**
        * fileOffset:继续下载时,文件的开始位置
        * expectedTotalBytes:剩余的数据总数
        */
        
      • 下载完成时调用的方法

        - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
        /**
        * location:下载的文件保存的临时位置
        * 需要将下载的文件保存在可以长期保存的位置
        */
        

    NSURLSession网络请求


    • Block回调的方式
      • 获取NSURLSession对象

        NSURLSession *session =[NSURLSession sharedSession];
        
      • 创建请求任务

        NSURLSessionTask *task = [session downloadTaskWithURL:(此处为请求的URL路径) completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
        	//此处为请求任务完成后的回调Block,即:任务完成后会执行这里的代码
        	}];
        
      • 启动任务

        [task resume];
        
    • 代理的方式
      • 获得NSURLSession对象

        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
        
      • 创建请求任务

        NSURLSessionTask *task = [session dataTaskWithRequest:(此处为NSURLRequest对象)];
        
      • 启动任务

        [task resume];
        
      • 实现代理方法做进一步处理

  • 相关阅读:
    python报以下错误:TypeError: 'int' object is not subscriptable
    C# Func与Action
    C#调用C++的DLL 尝试写入受保护的内存
    C#调用C++的dll EntryPointNotFoundException
    C# 拖拽事件
    C#操作Access数据库中遇到的问题(待续)
    Winform 中写代码布局中遇到的控件遮盖问题
    thinkphp6执行流程(一)
    xdebug调试过程中apache500超时
    禁用phpcookie以后如何使用Session
  • 原文地址:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/4746833.html
Copyright © 2011-2022 走看看