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

通过设置代理我们可以拿到下载进度,对于大文件,我们还需要做到开始、暂停、继续以及取消等相应操作,这篇文章先简单的介绍一下通过代理来实现文件下载的问题:

#import "ViewController.h"
@interface ViewController ()<NSURLSessionDownloadDelegate>
@end
@implementation ViewController
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
  [self delegate];
}

-(void)delegate
{
  //1.url
  NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_03.png"];

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

  //3.创建session :注意代理为NSURLSessionDownloadDelegate
  NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

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

  //5.执行Task
  [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实现文件断点下载的方法

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

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

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

  • Python中使用socks5设置全局代理的方法示例

    0x01介绍 PySocks使您可以通过SOCKS和HTTP代理服务器发送流量.它是SocksiPy的现代分支,具有错误修复和其他功能. 0x02 安装 λ pip3 install Pysocks 0x03 测试 正常请求,httperror无法获得 加入socks5代理后,可以获得当前程序的全局代理可以 正常访问 import socket import socks socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 10808)

  • iOS开发-实现大文件下载与断点下载思路

    大文件下载 方案一:利用NSURLConnection和它的代理方法,及NSFileHandle(iOS9后不建议使用) 相关变量: @property (nonatomic,strong) NSFileHandle *writeHandle; @property (nonatomic,assign) long long totalLength; 1>发送请求 // 创建一个请求 NSURL *url = [NSURL URLWithString:@""]; NSURLReque

  • 前端 javascript 实现文件下载的示例

    在 html5 中,a 标签新增了 download 属性,包含该属性的链接被点击时,浏览器会以下载文件方式下载 href 属性上的链接.示例: <a href="https://www.baidu.com" rel="external nofollow" download="baidu.html">下载</a> 1. 前端 js 下载实现与示例 通过 javascript 动态创建一个包含 download 属性的 a

  • iOS Swift开发之日历插件开发示例

    本文介绍了iOS Swift开发之日历插件开发示例,分享给大家,具体如下: 效果图 0x01 如何获取目前日期 关于日期,苹果给出了 Date 类,初始化一个 Date 类 let date = Date() 打印出来就是当前系统的日期和时间 那么如何单独获得当前年份,月份呢? var date: [Int] = [] let calendar: Calendar = Calendar(identifier: .gregorian) var comps: DateComponents = Dat

  • iOS 实现多代理的方法及实例代码

    iOS实现多代理 什么是多代理 用过环信SDK的同学应该对多代理不陌生了,请看下面代码: @method @brief 注册一个监听对象到监听列表中 @discussion 把监听对象添加到监听列表中准备接收相应的事件 @param delegate 需要注册的监听对象 @param queue 通知监听对象时的线程 @result */ - (void)addDelegate:(id<EMChatManagerDelegate>)delegate delegateQueue:(dispatc

  • iOS中设置清除缓存功能的实现方法

    绝大多数应用中都存在着清楚缓存的功能,形形色色,各有千秋,现为大家介绍一种最基础的清除缓存的方法.清除缓存基本上都是在设置界面的某一个Cell,于是我们可以把清除缓存封装在某一个自定义Cell中,如下图所示: 具体步骤 使用注意:过程中需要用到第三方库,请提前安装好:SDWebImage.SVProgressHUD. 1. 创建自定义Cell,命名为GYLClearCacheCell 重写initWithStyle:(UITableViewCellStyle)style reuseIdentif

  • iOS 对view进行截图的示例代码

    本文主要介绍了iOS 对view进行截图的示例代码,分享给大家,具体如下: 需要对WKWebView进行截图,之前用的是下面的方法,高版本的系统是没有问题的,低版本的却截到一张白图 - (UIImage *)convertViewToImage:(UIView *)view{ // 第二个参数表示是否非透明.如果需要显示半透明效果,需传NO,否则YES.第三个参数就是屏幕密度了 UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.boun

  • python设置代理和添加镜像源的方法

    为什么要修改镜像源? 一般使用python安装库,会用到pip install xxx 指令或者conda install xxx指令,因为pip和conda默认国外镜像源,这时会在Python的官方源pypi.python.org/pypi 下载,速度很慢,有时会因为超时会抛异常无法下载成功,所以可以选择一些比较稳定速度比较快的国内镜像来下载python库,可以显著加快模块安装速度. 为什么要设置代理? 当计算机被限制上网时(公司安全考虑)就不能连外网了,此时需要设置代理来解决:通常公司要求通

随机推荐