简介


  • 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];
    • 实现代理方法做进一步处理

iOS网络-03-NSURLSession与NSURLSessionTask的更多相关文章

  1. iOS网络2——NSURLSession使用详解

    原文在此 一.整体介绍 NSURLSession在2013年随着iOS7的发布一起面世,苹果对它的定位是作为NSURLConnection的替代者,然后逐步将NSURLConnection退出历史舞台 ...

  2. iOS 网络请求NSURLSession

    iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我 ...

  3. iOS 编程:NSURLSession

    定义:描述 Foundation 框架类在标准的网络传输协议下,用 URLs 连接因特网并与服务器交互的一整套体系. 支持的传输协议: File Transfer Protocol (ftp://) ...

  4. iOS网络学习之“远离NSURLConnection 走进NSURLSession”

    目前,在iOS的开发中,NURLConnection已经成为了过去式,现在的NSURLConnection已经deprected(iOS7之后),取而代之的是NSURLSession.而且AFNetw ...

  5. IOS网络请求之NSURLSession使用

    前言: 无论是Android还是ios都离不开与服务器交互,这就必须用到网络请求,记得在2013年做iOS的时候那时候用的ASIHTTPRequest框架,现在重新捡起iOS的时候ASIHTTPReq ...

  6. iOS边练边学--NSURLSession、NSURLSessionTask的介绍与使用以及url中包含了中文的处理方法

    一.NSURLSession.NSURLSessionTask的使用步骤 首先创建NSURLSession对象 通过NSURLSession对象创建对应的任务 <1>NSURLSessio ...

  7. iOS 网络编程:AFNetworking

    1 简介 1.1 概念 AFNetworking网络框架并不是IOS自带的框架,而是第三方的开源框架.它是对NSURLConnection和NSURLSession API的封装,但是目前AFNetw ...

  8. iOS网络之数据请求GET和POST

    1. HTTP和HTTPS协议 1> URL URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位 ...

  9. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

  10. 【转载】一步一步搭建自己的iOS网络请求库

    一步一步搭建自己的iOS网络请求库(一) 大家好,我是LastDay,很久没有写博客了,这周会分享一个的HTTP请求库的编写经验. 简单的介绍 介绍一下,NSURLSession是iOS7中新的网络接 ...

随机推荐

  1. java--实现将文字生成二维码图片,并在中间附上logo,下方附上文字

    前段时间因为工作需要,要实现将一段文字或者url生成二维码,然后中间附上logo,下方正中间附上文字的功能. 上网找了几篇教程学习了下,由于没有保存借鉴的博文链接,所以就没po上参考文章的链接啦,感谢 ...

  2. 实用手册:130+ 提高开发效率的 vim 常用命令

    Vim 是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器.这里收录了130+程 ...

  3. HT for Web中3D流动效果的实现与应用

    流动效果在3D领域有着广泛的应用场景,如上图中医学领域可通过3D的流动直观的观察人体血液的流动,燃气领域可用于监控管道内流动的液体或气体的流向.流速和温度等指标. 如今企业数据中心机房普遍面临着设备散 ...

  4. asp.net url重写相关技术问题整理

    1.IIS7配置URL重写需要注意系统是32位还是64位的 在IIS7配置URL重写的时候,需要添加“脚本映射”,如果是64位系统,会有两个地方存放.net framework分别是32位系统和64位 ...

  5. 分享一下学习css,js心得

    简化代码,使页面简洁! web前端开发——将界面更好呈现给用户! 要了解在不同浏览器上的兼容情况.渲染原理和存在的bug! 网站性能优化.SEO: 代码的可维护性.性能: 网站重构的本质:建立一个前端 ...

  6. 大话设计模式-->模板方法设计模式

    在学习java的过程中,我们肯定听到过设计模式这名词,在行业中有这么一句话,若您能熟练的掌握23种设计模式,那么你便是大牛! 好了,废话不多说,今天我跟大家分享一下23种设计模式之一的  模板方法 设 ...

  7. IBatis 配置一对多

    -------说明-------- IBatis 版本2.0 配置一对多 namespace = testDao ------------------ /** *班级的resultMap *Class ...

  8. API的非向后兼容性无论如何通常代表着一种比较差的设计

    不管一个类库或者工具方法实现多么的好,如果无法做到向后兼容性,通常会给用户带来很大的升级成本,很多对此的依赖如果希望在后续的升级和维护期间使用该类库的其他新增特性或者好处,将不得不推迟升级亦或是被迫接 ...

  9. Mysql优化经验

    一.索引优化 范围匹配使用B-tree索引  等值匹配使用 HASH索引,hash所有唯一Memory引擎 2.索引三星系统, 1.相关记录放到一起 2.索引中的数据和查找中的排序顺序一直 3.索引的 ...

  10. 【Android】开源项目UI控件分类汇总之Dialog

    接前文ProgressBar:Android开发的宝库越来越多,我开发中有需要的组件,主要参考Trinea的大作Android开源项目分类汇总(包含了后面的绝大多数).CSDN上直接拿来用!最火的An ...