简介


  • 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. 左倾堆(二)之 C++的实现

    概要 上一章介绍了左倾堆的基本概念,并通过C语言实现了左倾堆.本章是左倾堆的C++实现. 目录1. 左倾堆的介绍2. 左倾堆的图文解析3. 左倾堆的C++实现(完整源码)4. 左倾堆的C++测试程序 ...

  2. Android 布局之TableLayout

    Android 布局之TableLayout 1 TableLayout简介 TableLayout是表格布局.TableLayout 可设置的属性包括全局属性及单元格属性. 1.1 全局属性 有以下 ...

  3. webpack多页面开发与懒加载hash解决方案

    之前讨论了webpack的hash与chunkhash的区别以及各自的应用场景,如果是常规单页面应用的话,上篇文章提供的方案是没有问题的.但是前端项目复杂多变,应对复杂多页面项目时,我们不得不继续踩w ...

  4. LeetCode——Contains Duplicate III

    Description: Given an array of integers, find out whether there are two distinct indices i and j in ...

  5. rsync同步Nginx日志遇到问题总结

    一.目的 将nginx 日志通过普通用户利用rsync公钥认证的方式实时同步到本地服务器上,之后使用elk程序进行处理. 二.遇到问题及解决方法思路 问题1.文件权限:nginx 的日志默认权限如下: ...

  6. 让JS写的更接近OOP

    下面这段代码就是利用JS原型对象,来实现的类的继承DEMO $ 为jquery对象 ////公共方法 // $.oop.newClass=function newClass(obj) { // fun ...

  7. angular设置title

    Javascript框架在处理seo方面存在问题,因为爬虫在检索seo信息的时候会读不了js给其赋的值,导致搜索引擎收录不了或者收录了无效的信息,比如收录的可能是title={{title}}这样的, ...

  8. ThroughRain第二次冲刺(每天更新

    第二次冲刺时间: 11月28-12月5号 第一次冲刺目标及分配: 1. 查询点餐界面         认领:梁仕标 2. 链接数据库            认领:冯梓凡 3. 建立数据库的表     ...

  9. C#反射的应用

    项目框架中有一个很实用的方法,它用来获取客户端post的数据,并自动赋值到对象各属性,这样后台少写了很多代码.但是对于有主表.子表的表单,框架中没有提供自动给子表对象各属性赋值的方法,每次都要写很多代 ...

  10. [CLR via C#]18. Attribute

    attribute可以说是Microsoft .NET Framework提出的最具创意的技术之一了.利用attribute,可以声明性的为自己的代码构造添加注解,从而实现一些特殊的功能.attrib ...