iOS进阶_NSURLSession(二.断点续传)

2023-11-18

断点续传

从上一篇文章中,我们了解了使用NSURLSession进行文件下载,我们在其基础上继续探索NSURLSession的断点续传。

在NSURLSession中,我们使用reumeData来存储下载的数据进度。

#import "ViewController.h"
#import "WTProgressBtn.h"

@interface ViewController ()<NSURLSessionDownloadDelegate>

/** 全局的网络会话(Session),管理所有的网络任务  **/
@property(nonatomic,strong)NSURLSession * session;
@property (weak, nonatomic) IBOutlet WTProgressBtn *progressView;
/** 全局的下载任务  **/
@property(nonatomic,strong)NSURLSessionDownloadTask * downloadTask;
/** 续传的数据  **/
@property(nonatomic,strong)NSData * reumeData;

@end

@implementation ViewController

-(NSURLSession *)session{
    if (!_session) {
        //config 提供了一个全局的网络环境配置,包括:身份验证,浏览器类型,cookie,缓存,超时...
        NSURLSessionConfiguration * config =[NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    return _session;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


- (IBAction)start {

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSURL * url = [NSURL URLWithString:@"http://127.0.0.1/abc.wmv"];
        NSLog(@"开始");
        self.downloadTask = [self.session downloadTaskWithURL:url];
        [self.downloadTask resume];
        NSLog(@"%@",[NSThread currentThread]);
    });

}
//暂停
- (IBAction)pause:(id)sender {
    NSLog(@"暂停");
    [self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
        //resumeData 续传的数据(下载了多少)
        self.reumeData  =resumeData;
        //释放下载任务
        // - 让我们task设置为week,就可以不用释放了
        //因为任务都是由session发起的,而session对发起的任务都会持有一个强引用,但是不建议这样做
        self.downloadTask = nil;
    }];
}

//继续
- (IBAction)resume:(id)sender {
    if (self.reumeData == nil) {
        NSLog(@"无暂停任务");
        return;
    }
    //所有的任务都是由session发起的

    //使用续传数据启动下载任务
    self.downloadTask =  [self.session downloadTaskWithResumeData:self.reumeData];
    //清空续传数据
    self.reumeData = nil;
    //所有的任务都是默认挂起的
    [self.downloadTask resume];
}

#pragma mark - <NSURLSessionDownloadDelegate>
/*
 iOS7.0,以下三个方法都是必须要实现的,到了iOS8.0只剩下下载完成是必须的
 */
/*1.下载完成方法*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    NSLog(@"完成 %@",location);
}
//2.下载进度
/**
 1.session
 2.downloadTask  调用代理方法的下载任务
 3.bytesWritten  本次下载的字节数
 4.bytesWritten  已经下载的字节数
 5.totalBytesExpectedToWrite 期望下载的字节数 -> 文件总大小
 */
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
    float progress = (float)totalBytesWritten / totalBytesExpectedToWrite ;
    //回到主线程
    dispatch_async(dispatch_get_main_queue(), ^{
        self.progressView.progress = progress;
    });

    NSLog(@"%f %@",progress,[NSThread currentThread]);
}
//3.下载续传数据
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes{

}


@end

NSURLSession代理的队列

上面代码中的全局session中,我们创建session的时候使用了_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];

队列:设置回调的代理方法在哪里执行
- 代理的队列 如果给nil 那么队列将在多个线程中执行
- 如果设置为[NSOperationQueue mainQueue] 那么将在主线程中执行

session会对代理进行强引用,如果任务执行结束后,不取消session,会出现内存泄露
因此我们对其进行处理

/*1.下载完成方法*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
    NSLog(@"完成 %@",location);
    //完成任务
    [self.session finishTasksAndInvalidate];
    //清空session
    self.session = nil;
}

为什么session需要strong进行修饰呢?苹果为什么这么设计?

因为在真正的网络访问中

-在网络开发中,应该将所有的网络访问操作,封装到一个方法中,由一个统一的单例对象来负责所有的网络事件监听。
-session对代理(单例)进行强引用,单例本身就是一个静态的实例,本身就不需要释放
-AFN -> 需要建立一个AFN Manager

假如我们在下载未完成前,离开该页面,且停止下载任务,我们还需要

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    //取消会话
    [self.session invalidateAndCancel];
    self.session = nil;
}

在以后的文章中,我们还需要对AFN的封装实现原理进行更详细的分析,希望能让我们更好的提高对AFN第三方代码的理解。

gitHub-demo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS进阶_NSURLSession(二.断点续传) 的相关文章

  • iOS进阶_密码学进阶(二.对称加密算法代码演练)

    对称加密算法代码演练 终端测试指令 DES ECB 加密 echo n hello openssl enc des ecb K 616263 nosalt base64 DES CBC 加密 echo n hello openssl enc
  • iOS架构师_观察者模式

    定义 观察者模式 有时又被称为模型 视图 View 模式 源 收听者 Listener 模式或从属者模式 一个目标物件管理所有相依于它的观察者物件 并且在它本身的状态改变时主动发出通知 这通常透过呼叫各观察者所提供的方法来实现 此种模式通常
  • 断点续传:大文件分片上传

    有时用户上传下载文件需要历时数小时 万一线路中断 不具备断点续传的方式就只能从头重传 断点续传方式允许用户从上传下载断线的地方继续传送 这样大大减少了用户的烦恼 分片上传 就是将所要上传的文件 按照一定的大小 将整个文件分隔成多个数据块 我
  • iOS中socket通信---基于CocoaAsyncSocket实现

    前言 最近项目中涉及到socket通信这块 所以有幸有时间大概看了一下这一块 目前还在实现阶段 因此现在还不能去些具体的实现过程 现在只大概描述一下这几天看的资料和自己的一点心得吧 等项目实现之后会将具体的实现流程写出来以供大家参考 Soc
  • iOS架构-组件化(项目实战-项目首页架构)

    UI架构设计 设计模式 外观模式 代理模式 适配器模式 adapter 注意 一版本只是搭建结构 一 1 0 Tab搭建 二 1 1 新增UICollectionView 主页 gt 整体设计基于 gt UICollectionView 滑
  • iOS架构师_架构模式(代理,block,通知,MVC,MVP,MVVM)

    1 什么是架构 没有明确的定义 属于设计的一方面 没明确的把设计和架构进行区分 它可以小到类与类之间的交互 大到不同模块之间 以及不同业务之间的交互 都可以从架构的层面去理解它 所有架构和设计模式的目的都是为了解耦合 2 基本的架构基础 案
  • iOS进阶—Runtime源码解析:动态方法解析

    GitHub参考 PS 参考GitHub分享的objc runtime master代码 及Runtime003代码 iOS进阶 目录 接上文iOS进阶 Runtime源码解析 消息发送 查看Runtime源码 No implementat
  • iOS核心动画CoreAnimation系统进阶(赛贝尔曲线-菜单侧滑动画拆分动画详解)

    我们知道动画是基于绘制的 多次绘制贝塞尔的过程就会形成动画 流畅的动画效果会给用户带来不一样的使用体验 下面我们就让App开发中经常使用到的侧滑动画进行拆分详解 效果图如下 为侧滑动画封装一个slideMenuView 绘制侧滑动画需要下面
  • iOS架构师_SDWebImage源码分析

    1 对SDdemo的分析 针对SD的3 8 2版本进行分析 因为从git上面直接下载SD的源码 项目运行会报错 缺少libwebp这个库 我们下载3 8 2版本 运行 libwebp 是个webp的图片格式 属于谷歌的库 所以只能翻墙去国外
  • 新技能 get —— Python 断点续传下载文件

    from urllib request import urlretrieve import sys import os prev reported download percent None 首先定义下载 hook 作为 urllib re
  • Android多线程下载断点续传

    先上图看卡结果 GITHUB Android多线程下载断点续传 下载杵这儿 如图所示点击下载就开始下载 点击停止就会停止再次点击下载就会接着下载了 设计思路是这样的 首先通过广播将下载信息传递给DownService DownService
  • iOS进阶_NSURLConnection(被弃用的原因:Connection的缺点)

    NSURLConnection下载 我们在前面的文章中介绍了MAC电脑搭建Apache服务器 在Sites文件夹中放置一个视频文件MVVM mp4 pbb 通过NSURLConnection进行下载 访问http localhost 我们可
  • iOS架构师_消息转发机制

    1 动态方法解析 对象在收到无法处理的消息时 会调用下面的方法 前者是调用类方法时会调用 后者是调用对象方法时会调用 未实现类方法调用 BOOL resolveClassMethod SEL sel 未实现实例方法调用 BOOL resol
  • iOS开发之ReactiveCocoa框架(RAC)第五篇队列与高级函数

    h文件 import ViewController h import ReactiveCocoa interface ViewController end implementation ViewController void viewDid
  • iOS开发之Runtime运行时机制

    摘要 Objective C是基于C加入了面向对象特性和消息转发机制的动态语言 除编译器之外 还需用Runtime系统来动态创建类和对象 进行消息发送和转发 作者通过分析Apple开源的Runtime代码来深入理解OC的Runtime机制
  • iOS进阶_密码学进阶(三.非对称加密算法-RSA公钥私钥的生成)

    应用场景 集成支付宝SDK 会看见 p12文件也有 非对称加密算法 一 运行终端 生成私钥 1 cd Users mac Desktop iOS 加密 2 openssl genrsa out private pem 512 生成私钥 注意
  • iOS开发 多线程的高级应用-信号量semaphore

    在iOS开发的道路上 多线程的重要性不言而喻 大部分我们都停留在基础的使用上面 缺乏高级应用 缺乏提升 是因为我们面对他太少 复杂的事情重复做 复杂的事务基础化 差距就是这样拉开了 言归正传 今天讲讲GCD的高级应用之信号量篇 一 信号量的
  • iOS进阶_NSURLSession(二.断点续传)

    断点续传 从上一篇文章中 我们了解了使用NSURLSession进行文件下载 我们在其基础上继续探索NSURLSession的断点续传 在NSURLSession中 我们使用reumeData来存储下载的数据进度 import ViewCo
  • iOS进阶_kvc使用注意事项

    细节1 我们在项目中使用kvc 在设置model属性的时候 注意尽量不要使用基本数据类型 实例 数据模拟 注意age是null类型的 Person h import
  • 多线程下载文件(支持暂停、取消、断点续传)

    多线程下载文件 支持暂停 取消 断点续传 多线程同时下载文件即 在同一时间内通过多个线程对同一个请求地址发起多个请求 将需要下载的数据分割成多个部分 同时下载 每个线程只负责下载其中的一部分 最后将每一个线程下载的部分组装起来即可 涉及的知

随机推荐

  • oracle存储过程----存储过程执行简单的增删改查sql

    存储过程执行简单的增删改查sql 上一篇文章 oracle存储过程 变量的介绍及使用 PL SQL 下边是一个简单的数据库表 为了方便 我都定义成了varchar 类型 1 存储过程执行增加sql 首先写一个增加的存储过程 create o
  • MQTT学习笔记——MQTT协议使用

    http mosquitto org files source mosquitto 1 4 5 tar gz 安装出错时openssl等 需要更改 cd mosquitto 1 4vi config mk可以选择去掉SSL的功能 可以参考h
  • ES相关随手记

    ES相关随手记 一 基本操作 1 es三大属性 索引 映射 文档 1 1 索引 查看 es 中所有的索引信息 GET cat indices v 创建 索引 PUT products 创建 索引 指定库信息 PUT products set
  • 记一次关于MySQL分页查询的优化方案(聚集索引与非聚集索引)

    最近在工作中 有一段逻辑需要从一张大约70W数据的表中分页查询 最开始写的SQL是 SELECT FROM table name WHERE 1 1 ORDER BY time column DESC LIMIT 600000 10 查询时
  • 编译QT5.12.12版本WebEngine模块支持H264视频播放

    qt自带的QtWebEngine模块无法播放HTML5中的mp3 mp4 需要重新编译 提供编译好的下载 环境 QT5 12 12 VS2017 Python2 一 在64位windows系统下编译32位MSVC选择VS2017如下命令 右
  • Redis的五大数据类型(一)

    1 字符串类型 string 1 添加 查询 添加数据 set key value 如果key已存在 之前的value将会被覆盖 查询指定key的值 get key 127 0 0 1 6379 gt set name zhangsan O
  • XSS之xss-labs-level11

    文章目录 0x01 XSS Labs 0x02 实验工具 0x03 实验环境 0x04 实验步骤 0x05 实验分析 0x06 参考链接 0x01 XSS Labs XSS 跨站脚本攻击 是指恶意攻击者往Web页面里插入恶意Script代码
  • Java打印流

    java io Printstream 打印流 PrintStream为其他输出流添加了功能 使它们能够方便地打印各种数据值表示形式 Printstream特点 只负责数据的输出 不负责数据的读取 与其他输出流不同 Printstream永
  • Linux/Centos : gcc __attribute__关键字之visibility

    visibility用于设置动态链接库中函数的可见性 将变量或函数设置为hidden 则该符号仅在本so中可见 在其他库中则不可见 g 在编译时 可用参数 fvisibility指定所有符号的可见性 不加此参数时默认外部可见 参考man g
  • git上传文件到github

    通过git工具上传本地文件夹 1 下载git工具 2 安装 3 打开git bash exe 4 在打开的GIt Bash中输入以下命令 用户和邮箱为你github注册的账号和邮箱 git config global user name C
  • 虚拟机架云服务器,云服务器 虚拟机架设

    云服务器 虚拟机架设 内容精选 换一换 通过云服务器或者外部镜像文件创建私有镜像时 如果云服务器或镜像文件所在虚拟机的网络配置是静态IP地址时 您需要修改网卡属性为DHCP 以使私有镜像发放的新云服务器可以动态获取IP地址 本节以Windo
  • 安卓基础之Intent的用法

    Intent的用法 意图的分类和用法 隐式意图 通过指定一组数据或者动作实现 Intent intent new Intent intent setAction intent addCatogary intent setDataAndTyp
  • cim系统 是什么_CIM和IBM i:它是什么以及它如何工作

    什么是CIM 如果您对IBM i知识不熟悉CIM 那么您来对地方了 CIM提供了一种建模和公开管理信息的标准方法 从V5R4开始 通过加载IBM通用可管理性启用 UME 许可程序 在IBM i上提供了CIM 并且在IBM i 6 1和IBM
  • JavaScript 等待 body,frame,frameset,iframe,img,link,script,style加载完成操作

    body frame frameset iframe img link script style 标签有 onload事件 通过监听以上的 onload事件 可以达到 对于标签加载完成后在做一些事情 查看图片的所有属性 以及事件 conso
  • uniapp的那些坑

    1 selectedColor不起作用 1 查看位置是否写对 与lis同级 2 是否为16进制 selectedColor写的rgb不支持 3 是否被其他样式覆盖 其他地方也设置过selectedColor 可以全局搜索一下 2 pages
  • VSCode远程连接ubuntu服务器

    1 打开VSCode 安装插件 安装插件 汉化 方法如下 重启之后界面就都是中文了 因为我之前弄过了 如果你的已经是中文了 可以省去这一步 安装remote development插件 如下图 用于远程连接服务器 安装好之后 左侧多了一个
  • 计算机视觉(CV)方向今年招聘情况怎么样?是否已经人才过剩?

    编辑 Amusi https www zhihu com question 293700785 本文仅作为学术分享 如果侵权 会删文处理 计算机视觉 CV 方向今年招聘情况怎么样 是否已经人才过剩 https www zhihu com q
  • 实验五:LINUX 下C语言使用、编译与调试实验

    实验五 LINUX 下C语言使用 编译与调试实验 一 实验目的 练习并掌握Linux提供的vi编辑器来编译C程序 学会利用gcc gdb编译 调试C程序 学会使用make工具 二 实验内容 编写C语言程序 用gcc编译并观察编译后的结果 运
  • 接口的加密解密

    接口加密 1 接口参数加密 基础加密 2 接口参数加密 接口时效性验证 一般达到这个级别已经非常安全了 3 接口参数加密 时效性验证 私钥 达到这个级别安全性固若金汤 4 接口参数加密 时效性验证 私钥 Https 我把这个级别称之为金钟罩
  • iOS进阶_NSURLSession(二.断点续传)

    断点续传 从上一篇文章中 我们了解了使用NSURLSession进行文件下载 我们在其基础上继续探索NSURLSession的断点续传 在NSURLSession中 我们使用reumeData来存储下载的数据进度 import ViewCo