线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配。不难理解,如果你线程多的话,那下载的越快。现流行的下载软件都支持多线程。
下面我们通过代码来了解以下几个知识点:
- 多线程下载;
- 自定义 NSOperation ;
- NSCache 增删改查;
- NSFileManager 增删改查;
- 代理模式;
- 闭包反向传值;
- 扩展方法;
- Plist 文件解析;
首先我们给 String 类型添加扩展方法,获取字符串的MD5值:
|
|
下面我们来自定义一个 NSOperation ,新建一个继承自 NSOperation 的类,并声明以下属性:
|
|
然后声明一个闭包:
|
|
最后声明一个协议,并创建两个代理方法:
|
|
下面我们重写自定义 NSOperation 的 init 方法,用来创建沙盒目录,实例 NSCache NSFileManager NSOperationQueue :
|
|
下面是闭包反向传值的第一步,初始化闭包:
|
|
下面我们利用文件名获得要保存的路径:
|
|
下面我们利用文件名判断这个文件在内存中是否存在:
|
|
下面我们利用文件名判断这个文件在磁盘中是否存在:
|
|
下面我们实现利用文件名从内存中获取文件:
|
|
下面我们实现利用文件名从磁盘中获取文件:
|
|
下面我们实现利用链接下载文件:
|
|
下面实现将文件写入内存:
|
|
下载实现将文件写入磁盘:
|
|
下面实现利用链接下载文件,并将下载的文件写入内存和磁盘:
|
|
下面实现读取文件,如果内存中有就从内存读取,如果磁盘中有就从磁盘读取,并写入到内存,如果都没有,就下载并写入到内存和磁盘:
|
|
下面实现利用存放链接的数组,批量下载文件,设置下载线程的最大值并使用 block 执行 ViewController 预设的方法:
|
|
下面实现利用文件名删除文件:
|
|
下面实现调用代理的两个方法:
|
|
下面我们回到 ViewController 中,声明以下几个属性:
|
|
下面我们创建 block 要执行的方法:
|
|
下面我们解析 Plist 文件为数组,并将包含下载链接的数组传给自定义 NSOperation 的获取文件方法:
|
|
下面我们给 ViewController 添加两个 Button :
|
|
下面我们实现 Button 的响应事件方法:
|
|
下面我们实现代理方法:
|
|
最后我们引入代理协议,实例化自定义的 ,实例化代理对象,实例化 block,以上几个功能点就完成了:
|
|
完整代码如下:
|
|
|
|
|
|