详细代码,请戳这里
下面就是絮叨了一下思想,其实并没有什么卵用。
断点下载
暂停/继续下载是现在下载中必备的功能了,如果没有暂停功能,用户体验相比会很差,而且如果突然网络不好中断了,没有实现断点下载的话只有重新下了。。。断点下载的本质就如上图所示,就是记录一下上次下载后的文件的字节总大小,在利用记录的记录总大小,传给服务器。
关于单文件的断点下载,博客上比比皆是,其中的详细问题就不絮叨了。
下面我们谈论一下多文件的断点下载,首先由一下问题要考虑:
1、多个任务,如何控制
2、如何保证每一个下载任务在下载过程中没有被销毁
关于第一个问题
好多论坛,博客上面所说的下载类,在同一时间段内下载一个文件还行,
但是,你要是下载多个任务,一系列问题就迸发出来了,任务的取消和暂停此时怎么控制?怎么把有业务逻辑的任务和此时的下载任务一一对应起来?
这时,就应该在这个下载类的上面再封装一次,由这个上层类创造任务,控制他们
关于第二个问题
上面的问题说到,创造一个上层类,我们都知道搞一个单例对象来实现这个实例不被销毁
我们知道,对象不会销毁,它的属性也不会销毁,所以在这个上层类中添加一个taskDict的字典属性(/** 存储下载的HFDownloader,因为单个任务对应一个HFDownloader 的实例)这样每一个下载任务就被保存了起来,而且可以随时随地的取出来进行其他操作。
关于用法
-->1.在项目中导入HFDownloadManager.h头文件;
-->2.搭建UI时,设置显示进度的UIProgressView的进度值:[[HFDownloadManager sharedManager] lastProgressWithUrl:url],
这个方法的返回值是float类型的;
设置显示文件大小/文件总大小的Label的文字:[[HFDownloadManager sharedManager]fileSize:url];
-->3.开始或恢复下载任务的方法:[HFDownloadManager sharedManager] downloadWithUrlString:(NSString *)urlString
toPath:(NSString *)destinationPath
process:(ProcessHandle)process
completion:(CompletionHandle)completion
failure:(FailureHandle)failure];
这个方法包含三个回调代码块,分别是:
1)下载过程中的回调代码块,带3个参数:下载进度参数progress,已下载文件大小sizeString,文件下载速度speedString;
2)下载成功回调的代码块,没有参数;
3)下载失败的回调代码块,带一个下载错误参数error。
-->4.在下载出错的回调代码块中处理出错信息。在出错的回调代码块中或者暂停下载任务时,
调用[[HFDownloadManager sharedManager] cancelDownloadTask:url]方法取消/暂停下载任务;
-->5.如果在非下载界面监听下载进去 注册通知 监听 《HFProgressDidChangeNotificaiton》 返回参数里有一个字典,里面包含四个参数 @{@"url":self.urlString, 请求下载的url
@"progress":@(progress), 下载进度
@"sizeString":sizeString,下载的大小
@"speedString":speedString} 下载速度
-->6.彻底删除下载任务,就在把下载到内存的文件也删除
[[HFDownloadManager shredManager] removeForUrl:url file:destinationPath];
url 是下载的url地址
destinationPath 下载的文件存储路径
在这个manager中的cancleTask不是我们想象中的暂停,它是直接把任务取消了,因为,我们每次请求下载任务的时候都已经知道了这个文件已经内存中的位置和大小了。直接利用服务器开始新的下载就OK了。
更详细的用法,在demo中都有代码注释。
如果你觉得有用,请给小子一个👍。