iOS NSURLSessionDownloadTask实现文件断点下载的方法

所谓断点下载:就是实现开始、暂停、继续以及取消等操作。上一篇我们已经谈到了通过设置代理实现文件的连续下载,也就是文件从开始一直到下载完成,中途不中断。这种方式比较适用一些小文件的下载,比如:微信里面的表情包下砸。就算中途因为其他原因中断了下载,我们重新开始下载也不会浪费用户很多流量,用户体验也不会因此变的很差。

在实现断点下载之前:我们需要清楚对什么进行断点下载,是对网络请求NSURLSession还是对任务NSURLSessionDownloadTask。下载文件只会发送一次请求,我们操作应该是任务。

NSURLSessionTask部分方法截图:

.m文件代码

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDownloadDelegate>
@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;
@property (nonatomic, strong) NSData *resumData;
@property (nonatomic, strong) NSURLSession *session;
@end

@implementation ViewController

// 开始下载
- (IBAction)startBtnClick:(id)sender
{
  //1.url
  NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];

  //2.创建请求对象
  NSURLRequest *request = [NSURLRequest requestWithURL:url];

  //3.创建session
  NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
  self.session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

  //4.创建Task
  NSURLSessionDownloadTask *downloadTask = [self.session downloadTaskWithRequest:request];

  //5.执行Task
  [downloadTask resume];

  self.downloadTask = downloadTask;

}

//暂停是可以恢复
- (IBAction)suspendBtnClick:(id)sender
{
  NSLog(@"+++++++++++++++++++暂停");
  [self.downloadTask suspend];
}

//cancel:取消是不能恢复
//cancelByProducingResumeData:是可以恢复
- (IBAction)cancelBtnClick:(id)sender
{
  NSLog(@"+++++++++++++++++++取消");
  //[self.downloadTask cancel];

  //恢复下载的数据!=文件数据,也就是记录开始下载的位置的相关信息,倘若是已下载的文件数据,就会存在内存增大的问题
  [self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
    self.resumData = resumeData;
  }];
}

- (IBAction)goOnBtnClick:(id)sender
{
  NSLog(@"+++++++++++++++++++恢复下载");
  if(self.resumData)
  {
    self.downloadTask = [self.session downloadTaskWithResumeData:self.resumData];
  }

  [self.downloadTask resume];
}

#pragma mark ----------------------
#pragma mark NSURLSessionDownloadDelegate
/**
 * 写数据
 *
 * @param session          会话对象
 * @param downloadTask       下载任务
 * @param bytesWritten       本次写入的数据大小
 * @param totalBytesWritten     下载的数据总大小
 * @param totalBytesExpectedToWrite 文件的总大小
 */
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
  //1. 获得文件的下载进度
  NSLog(@"%f",1.0 * totalBytesWritten/totalBytesExpectedToWrite);
}

/**
 * 当恢复下载的时候调用该方法
 *
 * @param fileOffset     从什么地方下载
 * @param expectedTotalBytes 文件的总大小
 */
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
{
  NSLog(@"%s",__func__);
}

/**
 * 当下载完成的时候调用
 *
 * @param location   文件的临时存储路径
 */
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
  NSLog(@"%@",location);

  //1 拼接文件全路径
  NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename];

  //2 剪切文件
  [[NSFileManager defaultManager]moveItemAtURL:location toURL:[NSURL fileURLWithPath:fullPath] error:nil];
  NSLog(@"%@",fullPath);
}

/**
 * 请求结束
 */
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
  NSLog(@"didCompleteWithError");
}

@end

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • iOS NSURLSessionDownloadTask设置代理文件下载的示例
(0)

相关推荐

  • iOS NSURLSessionDownloadTask设置代理文件下载的示例

    通过设置代理我们可以拿到下载进度,对于大文件,我们还需要做到开始.暂停.继续以及取消等相应操作,这篇文章先简单的介绍一下通过代理来实现文件下载的问题: #import "ViewController.h" @interface ViewController ()<NSURLSessionDownloadDelegate> @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *&g

  • iOS NSURLSessionDownloadTask实现文件断点下载的方法

    所谓断点下载:就是实现开始.暂停.继续以及取消等操作.上一篇我们已经谈到了通过设置代理实现文件的连续下载,也就是文件从开始一直到下载完成,中途不中断.这种方式比较适用一些小文件的下载,比如:微信里面的表情包下砸.就算中途因为其他原因中断了下载,我们重新开始下载也不会浪费用户很多流量,用户体验也不会因此变的很差. 在实现断点下载之前:我们需要清楚对什么进行断点下载,是对网络请求NSURLSession还是对任务NSURLSessionDownloadTask.下载文件只会发送一次请求,我们操作应该

  • Android实现多线程断点下载的方法

    本文实例讲述了Android实现多线程断点下载的方法.分享给大家供大家参考.具体实现方法如下: package cn.itcast.download; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt

  • JS实现单个或多个文件批量下载的方法详解

    目录 前言 单个文件Download 方案一:location.href or window.open 方案二:通过a标签的download属性 方案三:API请求 多个文件批量Download 方案一:按单个文件download方式,循环依次下载 方案二:前端打包成zip download 方案三:后端压缩成zip,然后以文件流url形式,前端调用download 总结 前言 在前端Web开发中,下载文件是一个很常见的需求,也有一些比较特殊的Case,比如下载文件请求是一个POST.url不是

  • C#实现文件断点续传下载的方法

    本文实例讲述了C#实现文件断点续传下载的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.IO; using System.Text; using System.Net; namespace simpleDemo { class Program { /// <su

  • Android实现断点下载的方法

    最近做的项目中需要实现断点下载,即用户一次下载可以分多次进行,下载过程可以中断,在目前大多数的带离线缓存的软件都是需要实现这一功能.本文阐述了通过sqlite3简单实现了一个具有断点下载功能的demo.言归正传,开始正文. 设计 数据库表存储元数据 DBHelper.java 用于业务存储的Dao Dao.java 抽象下载信息的Bean LoadInfo.java 呈现下载信息View MainActivity.java 存储下载信息Bean DownloadInfo.java 封装好的下载类

  • iOS利用AFNetworking3.0——实现文件断点下载

    0.导入框架准备工作 1. 将AFNetworking3.0+框架程序拖拽进项目 2. 或使用Cocopod 导入AFNetworking3.0+ 3.  引入 #import "AFNetworking.h" 1.UI准备工作 A. 定义一个全局的 NSURLSessionDownloadTask:下载管理句柄 由其负责所有的网络操作请求 @interface ViewController () { // 下载句柄 NSURLSessionDownloadTask *_downloa

  • Nginx配置txt、pdf、doc、xls等文件直接下载的方法

    使用Nginx时,如果要让一些附件比如 txt,pdf,doc等不直接在浏览器打开,而弹出另存为的对话框(也就是下载) 则可以在nginx的加上头配置如下: 复制代码 代码如下: if ($request_filename ~* ^.*?\.(txt|pdf|doc|xls)$){      add_header Content-Disposition: 'attachment;';  } 如果客户端请求的文件以txt.pdf.doc.xls为后缀的话则会让浏览器出现另存为对话框.

  • Android 断点下载和自动安装的示例代码

    今天说一下Android中下载App到手机中并自动安装,啥也不说了先上效果图了! 上面呢是下载中的一个图片和下载后会自动提示你安装的一个图片,二话不说,这接开代码吧! 首先来一个下布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ap

  • Java实现断点下载功能的示例代码

    目录 介绍 效果 前端代码 后端代码 介绍 当下载一个很大的文件时,如果下载到一半暂停,如果继续下载呢?断点下载就是解决这个问题的. 具体原理: 利用indexedDb,将下载的数据存储到用户的本地中,这样用户就算是关电脑那么下次下载还是从上次的位置开始的 先去看看本地缓存中是否存在这个文件的分片数据,如果存在那么就接着上一个分片继续下载(起始位置) 下载前先去后端拿文件的大小,然后计算分多少次下载(n/(1024*1024*10)) (结束位置) 每次下载的数据放入一个Blob中,然后存储到本

随机推荐