通过一个单例持有多个下载NSURLSessionDownloadTask

iOS NSURLSession后台下载多个任务,支持断点续传 首先,一些简单的概念这里不多说,想要了解NSURLSession如何简单实现后台下载功能,可以百度会有很多基础的文章可供参考。 我实现的功能类似于优酷里的视频下载,进到后台后可以一个接一个的下载,直到下载完成。 1.创建NSURLSession 创建不同identifier来区分不同的任务,我是根据视频ID来创建不同的任务。(我是在自己封装的下载类里创建下载会话,实现代理的,不是在A 阅读详情

我们通常使用单例来创建我们的下载,以便在各个类中使用,但是单例只能是唯一的,那么如何通过一个单例创建多个下载?我们可以在单例中添加一个私有的可变字典属性,将多个下载存入字典,如此,我们通过一个单例来创建多个下载任务,下面的代码,定义了有效的接口,可以很方便的在其它app中使用:

创建一个NSURLSessionDownloadTask类

//
//  Download.h
//  TestOfDownload

#import <Foundation/Foundation.h>
//定义block
typedef void(^finishedPath)(NSString *path, NSString *url);
typedef void(^downloading)(long long writeData, float progress);

//定义一个代理
@protocol DownloadDelegate <NSObject>
//一个一定要执行的代理, 作用: 让单例代理对象销毁下载对象
- (void)moveFinishedPathWithURL:(NSString *)url;
@end


@interface Download : NSObject<NSURLSessionDownloadDelegate>
@property (strong, nonatomic, readonly) NSString *url;//下载网址
@property (strong, nonatomic) NSURLSession *session; // 下载的支持父类
@property (strong, nonatomic) NSURLSessionDownloadTask *downloadTask;//下载;
@property (strong, nonatomic) NSMutableData *data; //保存断点下载的数据
@property (assign, nonatomic) id<DownloadDelegate>delegate;


//创建一个下载
- (instancetype)initWithURL:(NSString *)url;
//暂停接口
- (void)didSuspend;
//恢复下载接口
- (void)didResume;
//下载进度接口
- (void)didDownloading:(downloading)downloading finish:(finishedPath)finished;
@end

//
//  Download.m
//  TestOfDownload
#import "Download.h"

@interface Download ()
@property (copy, nonatomic) finishedPath downloadPath;//下载完成后路径
@property (copy, nonatomic) downloading downloading;//下载中数据
@end

@implementation Download

- (void)dealloc
{
    _delegate = nil;
}
- (instancetype)initWithURL:(NSString *)url {
    self = [super init];
    if (self) {
        _url = url; //赋值,readonly ,使用下划线
        self.session = [NSURLSession sessionWithConfiguration:nil delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        self.downloadTask = [self.session downloadTaskWithURL:[NSURL URLWithString:url]];
        [self.downloadTask resume];//调用父类NSURLSessionTask的重新下载方法
    }
    return self;
}
//暂停接口
- (void)didSuspend {
    __weak typeof(self) vc = self;
    [self.downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
        vc.data = (NSMutableData *)resumeData;
        vc.downloadTask = nil;
    }];
}
//恢复下载接口
- (void)didResume {
    self.downloadTask = [self.session downloadTaskWithResumeData:self.data];
    [self.downloadTask resume]; //调用父类的重新下载方法
    self.data = nil;
}
//下载进度接口
- (void)didDownloading:(downloading)downloading finish:(finishedPath)finished {
    self.downloading = downloading; //block赋值
    self.downloadPath = finished;
}


#pragma mark-----实现NSURLSessionDownloadDelegate代理------
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
    //完成下载
    
    //下载完成后移动到的文件夹路径
    NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    //下载完成后移动的文件路径
    NSString *file = [cache stringByAppendingPathComponent:downloadTask.response.suggestedFilename];//服务器的名字
    //对文件进行操作
    NSFileManager *fm = [NSFileManager defaultManager];
    //移动文件
    [fm moveItemAtPath:location.path toPath:file error:nil];
    
    //通过bloack,将下载网址和文件路径传出去
    self.downloadPath(file,self.url);
    //下载完成后执行销毁代理
    if ([_delegate respondsToSelector:@selector(moveFinishedPathWithURL:)]) {
        [_delegate moveFinishedPathWithURL:self.url];
    }
    
    //销毁对象,同NSTimer
    [self.session invalidateAndCancel];
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    //下载中
    
    //block传递下载的数据和进度
    float progress = (float)totalBytesWritten / totalBytesExpectedToWrite;
    self.downloading(bytesWritten, progress * 100.0);
    
}
@end

创建一个单例类:

//
//  SingletonDownload.h
//  TestOfDownload

#import <Foundation/Foundation.h>
#import "Download.h"
@interface SingletonDownload : NSObject<DownloadDelegate>

//创建单例
+ (instancetype)shareSingletonDownloader;
//添加一个下载
- (Download *)addDownloaderWithURL:(NSString *)url;
//根据url找到下载
- (Download *)findDownloaderWithURL:(NSString *)url;
//返回所有下载
- (NSArray *)allDownloader;

@end

//
//  SingletonDownload.m
//  TestOfDownload

#import "SingletonDownload.h"

@interface SingletonDownload ()
@property (strong, nonatomic) NSMutableDictionary *allDownloaderDic;//创建一个字典,用来保存当前的下载,使单例持有它,从而不会被销毁
@end

@implementation SingletonDownload
- (NSMutableDictionary *)allDownloaderDic {
    if (!_allDownloaderDic) {
        self.allDownloaderDic = [NSMutableDictionary dictionary];
    }
    return _allDownloaderDic;
}

//创建单例
+ (instancetype)shareSingletonDownloader {
    static SingletonDownload *singleton = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singleton = [[SingletonDownload alloc] init];
    });
    return singleton;
}
//添加一个下载
- (Download *)addDownloaderWithURL:(NSString *)url {
    //判断是否有下载
    Download *downloader =self.allDownloaderDic[url];
    downloader.delegate = self;
    if (!downloader) {
       downloader = [[Download alloc] initWithURL:url];
        //将单例存入字典中
        [self.allDownloaderDic setValue:downloader forKey:url];
    }
    return downloader;
}
//根据url找到下载
- (Download *)findDownloaderWithURL:(NSString *)url {
    return self.allDownloaderDic[url];
}
//返回所有下载
- (NSArray *)allDownloader {
    return [self.allDownloaderDic allValues];
}

#pragma mark-----代理执行----
- (void)moveFinishedPathWithURL:(NSString *)url {
    //下载完成,销毁对象
    [self.allDownloaderDic removeObjectForKey:url];
}

@end



iOS 音频下载NSURLSessionDownloadTask Model.h #import &lt;Foundation/Foundation.h&gt; /* Rule: * 第一版本后端目前不支持断点续传 * 第一版产品需求:仅支持单个音频下载 * 用户退到后台后账号被踢,只清除正在下载中的音频文件,不清除已下载的音频 * 用户退到后台后,如果网络断开,取消下载,下次进入需重新下载 */ typedef NS_ENUM(NSIntege... 阅读详情

相关推荐

ios-多文件下载,断点续传.zip

通过NSURLSession实现多文件下载,暂停之后的断点续传。代理逻辑清晰,便于理解。和大家一起讨论学习

用NSUrlSession批量下载文件并保存文件的处理

现在我来介绍之前说过的用NSUrlSession批量下载的方法,用NSUrlSession下载文件,有两种方法,一是直接调用Block方法做下载后的处理,二是利用NSUrlSessionDelegate的一系列方法,做下载文件后的处理,这种方法的好处就是可以随时监测下载进度。但是一旦选择调用代理方法,就不能用Block的初始化方法初始化,因为如果有Block方法,那么就会走Block,不会走代理方

ZhongLv_HoneyMoon的博客 2983

ios-使用NSURLSession进行的下载上传以及断点续传,可多个文件上传.zip

使用NSURLSession进行的下载上传以及断点续传,可多个文件上传demo

NSURLSession的下载和断点继传以及后台下载功能

NSURLSession始于ios7.它具有访问接口,上传/下载数据,断点继传和后台下载等功能: 其使用步骤: 1. 创建session指定其configuration 2. 由session执行任务得到task 3. task调用resume,启动网络请求session的任务有四种: 1. 数据任务 Data task 2. 下载任务 Download task 3. 上传任务 Uploa

花脚小蚊子的博客 1840

深度封装NSURLSession多任务下载 断点续传

深度封装了NSURLSession可实现多任务下载 断点续传 暂停 继续 删除 等功能

毕业论文管理系统的设计与实现

毕业论文工作是高等学校本科培养阶段的一个重要环节。目前论文管理工作存在着许多问题,例如人工管理极为不便;学生对论文所要撰写的内容并不十分了解,与指导老师的沟通非常不便;老师的指导监督也很难完全到位;手工评审的效率低等。而现有的一些毕业论文信息管理或答辩评审系统只是实现了部分网上交流和评审管理的功能,在答辩评审的自测和项目指标权重等方面都存在着一定的不足。因此,本文设计的毕业论文管理系统采用B/S模式开发。其中,Browser层使用JSP技术开发;

wqq_992250277的博客 3182

URLSession 后台多任务下载

苹果官方有个后台下载的DEMOSimple Background Transfer这个demo 展示了下载一个文件的示例在新的需求中,要求在一个表单中,能够实现多个任务的后台下载暂停等需求 于是把苹果的这个工程文件改写在使用过程中遇到了 一个很奇怪的问题就是无论怎么下载 始终只会返回给第一个下载任务的block找了很久 发现问题出现在- (NSURLSession *)backgroundSessi

github_35041937的博客 627

在 Kubernetes 上部署 Label Studio

Label Studio 是一款开源的数据标注工具,支持多种标注任务,如文本标注、图像标注、音频标注等。

啥都会一点 668

NSURLSessionDownloadTask (开始,暂停,继续,取消下载)

这里面使用代理的方法发送请求 @property(nonatomic,strong) NSURLSessionDownloadTask *downTask; @property(nonatomic,strong) NSData *resumData; 开始下载 1.确定URL NSURL *url = [NSURL URLWithString:@""]; 2.创建请求对象 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 3

weixin_44729579的博客 1829

Dell R730安装Windows Server 2008 R2

一、RAID驱动准备  在安装Windows server2008 R2操作系统时,如果没有发现硬盘,请将下面的阵列卡驱动先解压(在下载的.exe文件,双击点下一步会自动解压),解压后把那文件夹复制到U盘中。阵列卡 PERC9 H330 - H730 - H730P - H830 Controllers for Windows Server 2008 R2二、系统安装方法方法一:光盘安装  ①请您...

MarshLin 2万+

TMS320F280049C 学习笔记21 交叉开关 Crossbar (X-BAR)

简单介绍了X-BAR。

whyorwhnt的专栏 2万+

NSURLSessionDownloadTask下载内容

// // ViewController.m // NSURLSessionDownTask // // Created by hq on 16/4/17. // Copyright © 2016年 hanqing. All rights reserved. // #import "ViewController.h" @interface ViewController () @end

1008

Codex 命令行高效操作指南

本文详细介绍了Codex命令行工具的高效使用方法,包括安装配置、核心参数解析和实战技巧。通过`codex complete`、`codex explain`等指令,开发者可以快速生成代码、调试错误和重构项目,显著提升开发效率。特别推荐使用`--temperature`和`--max-tokens`参数优化生成结果。

weixin_29201313的博客 530

NSURLSessionDownloadTask 后台下载

1. NSURLSession相关简介 NSURLSession是iOS7的一个新特性,作为他的近亲NSURLConnection已经深感危机.iOS9的时候, 又被苹果轻轻一推,称霸武林的脚步往前迈了一大步... 1) .首先了解一下NSURLSession称霸的资本: NSURLSession 作为iOS7的一个新特性,它积极进化,除了保留NSURLConnection的基本组件NSURLRe...

__skye的博客 453

Fiori Elements Analytical List Page 标题区配置全攻略:从变体、过滤模式到 UI.KPI 的工程化落地

ALP标题区是Fiori Elements Analytical List Page的核心交互区域,承担变体管理、过滤模式切换、KPI展示等关键功能。本文系统解析了标题区的组成结构、可用能力及工程实现要点,包括:1)标题区包含过滤类型切换、全局KPI、变体管理等交互元素;2)详细说明视觉过滤与紧凑过滤的同步规则及实现方式;3)介绍OData V2下通过UI.KPI注解配置标题区KPI的方法;4)提供manifest.json配置示例和CDS注解写法。文章还对比了V2与V4版本的差异,为ALP开发提供实用指导

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 244

【超详细】计算机组成原理总结及思维导图

计算机组成 第一章 计算机系统概论 冯诺依曼型计算机特点 1.计算机由运算器,控制器,存储器,输入和输出设备5部分组成 2.采用存储程序的方式,程序和数据放在同一个存储器中,并以二进制表示。 3.指令由操作码和地址码组成 4.指令在存储器中按执行顺序存放,由指令计数器(即程序计数器PC)指明要执行的指令所在的储存单元地址,一般按顺序递增,但可按运算结果或外界条件而改变 5.机器以运...

圣三一 10万+

IOS开发Swift用NSURLSessionDownloadTask实现后台下载

1, 直接上代码:// // JPCDownloadHelper.swift // BTSDemo // // Created by jianxiong li on 16/3/10. // Copyright © 2016年 joobot. All rights reserved. // import Foundation var helpers:NSMutableDictionar

casun_li的专栏 1140

2020年大连理工大学《单片机原理及应用》期末试卷

2020年大连理工大学《单片机原理及应用》期末试卷 此试卷为大连理工大学2020年《单片机原理及应用》期末试卷; 大连理工大学2020年《单片机原理及应用》期末试卷; 大连理工大学2020年《单片机原理及应用》期末试卷。 ...

无名何许人的博客 1478

NSURLSessionDownloadTask下载文件

文件下载 使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中。 -(void)downloadFile{ //1.创建url NSString *fileName=@"1.jpg"; NSString *urlStr=[NSString

ArgentinaNo10的博客 1475

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NSURLSessionDownloadTask实现大文件下载

4 NSURLSessionDownloadTask实现大文件下载 (1)使用NSURLSession和NSURLSessionDownload可以很方便的实现文件下载操作 /* 第一个参数:要下载文件的url路径 第二个参数:当接收完服务器返回的数据之后调用该block location:下载的文件的保存地址(默认是存储在沙盒...

aeajzkl1278的博客 178

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NSURLSessionDownloadTask文件下载

本文内容大纲: 1、回顾NSURLSessionTask 2、NSURLSessionDownloadTask大文件之block下载 3、NSURLSessionDownloadTask大文件之代理方法下载 4、NSURLSessionDownloadTask大文件之代理方法实现断点续传下载   前言:如果读者是第一次阅读或者是学习关于本篇要介绍的NSURLSe

ZTLVV的专栏 1091

NSURLSessionDownloadTask(下载任务)

#import "ViewController.h" //宏定义继续任务的plist文件路径 #define kResumeDataPath [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/resumeData.plist"] @interface ViewController () NSURLSessionDownlo

Apel0811的博客 667

NSURLSessionDownloadTask 下载文件

1 -(void)RequestdataUI:(NSString*)ImageURL 2 imageName:(NSString*)imageName{ 3 4 NSURL *url = [NSURL URLWithString:ImageURL]; 5 NSMutableURLRequest *request = [...

dongbin19850725的博客 382

NSURLSessionDownloadTask(大文件下载---block)

优缺点 优点:不需要担心内存(一边下载一边存入沙盒) 缺点:无法监听文件下载 具体使用 1.确定URL NSURL *url = [NSURL URLWithString:@""]; 2.创建请求对象 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 3.创建会话对象 NSURLSession *session = [NSURLSession sharedSession]; 4.创建Task 第一个参数:请求对象

weixin_44729579的博客 438

NSURLSessionDownloadTask的深度断点续传

转自:http://www.cocoachina.com/ios/20160503/16053.html  如有侵犯,请来信oiken@qq.com 本文为投稿文章,作者:WeiTChen 对于后台下载与断点续传相信大家肯定不会陌生,那么如果要同时实现这两种需求该怎么办呢? 使用NSURLSessionDataTask可以很轻松实现断点续传,可是有个致命的缺点就

oiKen的博客 562
上一篇: Block方法与Block属性结合使用的小实现
下一篇: 友盟分享SDK编译错误
沉默的依恋
博客等级 码龄17年 16粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值