简介


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

OC - 15.NSURLSession与NSURLSessionTask的更多相关文章

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

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

  2. Effective OC : 1-5

    1,了解Objective-C语言的起源: OC为C语言的超集,为C加入了面向对象的特性. 要理解C中的指针和内存模型. 2.在类文件里尽量少引入其它头文件: 引入过多头文件.将借口暴露,添加耦合度. ...

  3. [swift]NSURLSession

    一.简单说明 在iOS9.0之后,以前使用的NSURLConnection过期,苹果推荐使用NSURLSession来替换NSURLConnection完成网路请求相关操作. NSURLSession ...

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

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

  5. NSURLSession、NSURLConnection

    NSURLSesstion GET方法 block回调方法NSString * urlStr = @"http://192.168.1.247:8100/stream?cname=cha_2 ...

  6. iOS基础 - NSURLSession

    使用URLSession所有的网络访问都是有缓存的,缓存文件自动保存在tmp文件夹中,URLSession本身实现的时候,就是少量多次的! l 使用defaultSessionConfiguratio ...

  7. swift开发网络篇—利用NSURLSession 发送GET和POST请求

    说明:本文示例代码发送的请求均为http请求,需要对info.plist文件进行配置.如何配置,请参考https://github.com/HanGangAndHanMeimei/iOS9Adapta ...

  8. NSURLSession网络接口

    URLSession URLSession NSURLSession是iOS7中新的网络接口,与NSURLConnection是并列的. 当程序在前台时,NSURLSession与NSURLConne ...

  9. AFNetworking 3.0 源码解读(五)之 AFURLSessionManager

    本篇是AFNetworking 3.0 源码解读的第五篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...

随机推荐

  1. IIS6、IIS7和IIS8各版本的差别

    一.写在前面 目前市面上所用的IIS版本估计都是>=6.0的.所以我们主要以下面三个版本进行讲解 服务器版本 IIS默认版本 server2003 6.0 server2008 7.0 serv ...

  2. centOS 下解压 rar zip 文件

    闲话不说,centos上如何安装rar.unrar在线解压缩软件呢?如果您的centos是32位的,执行如下命令: wget http://www.rarsoft.com/rar/rarlinux-3 ...

  3. Python默认编码错误SyntaxError: Non-ASCII character '\xe5'之解决方法

    在编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息: SyntaxError: Non-ASCII character '\xe5' in file ******* 解决方法: py ...

  4. CSS实现圆角,三角,五角星,五边形,爱心,12角星,8角星,圆,椭圆,圆圈,八卦

    转自:http://blog.csdn.net/chenhongwu666/article/details/38905803 CSS实现圆角,三角,五角星,五边形,爱心,12角星,8角星,圆,椭圆,圆 ...

  5. 应用程序无法正常启动0xc0150002 解决方式

        我也遇到过此问题,解决的方法: 方案一: 在项目的"属性|配置属性|链接器|常规"中的"启用增量链接"选择"否".此方法阻断了问题产 ...

  6. MVC-控制器向View传值的三种方法

    1.提供视图模型对象 你能把一个对象作为View方法的参数传递给视图. public ViewResult Index() { DateTime date = DateTime.Now; return ...

  7. Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!

    http://blog.csdn.net/yanzi1225627/article/details/8582081 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnab ...

  8. java数组 数组工具类Arrays

    一.数组 1.java有严格的数据类型限制,一个数组只能声明一个数据类型,存放同一种数据类型. 2.虽然只能存放一种数据类型,假设A , 如果数据类型B 继承A,依然能存放进入数组. 3.数组的初始化 ...

  9. SDWebImage 源码阅读分享

    SDWebImage 源码阅读分享 疑问列表 SDWebImage 整体框架图,主要的类包含哪些 SDWebImage 如何进行缓存管理,过期失效策略,缓存更新 SDWebImage 如何多线程处理的 ...

  10. 使用Android Studio时so文件打包不到APK中

    1,需要在build中添加如下配置,这是必备的 Android {   sourceSets {       main {           jniLibs.srcDirs = ['libs']   ...