Tiercel

  

Tiercel是一个非常简单易用且功能丰富的纯Swift下载框架。最大的特点就是拥有强大的任务管理功能和可以直接获取常见的下载信息,并且只要加上一些简单的UI,就可以实现一个下载类APP的大部分功能。

https://github.com/Danie1s/Tiercel

  • Features
  • Requirements
  • Installation
  • Example
  • Usage
    • 最简单的用法
    • TRManager
    • TRCache
    • TRDownloadTask
    • 后台下载
  • License

Features:

  • 支持大文件下载
  • 支持离线断点续传,APP关闭后依然可以恢复所有下载任务
  • 每个下载任务都可以单独管理操作
  • 每个下载任务和manager都有进度回调、成功回调和失败回调
  • 弃用单例模式,APP里面可以有多个manager,可以根据需要区分不同的下载模块
  • 内置了常见的下载信息,并且可以选择是否持久化下载任务信息
  • 支持后台下载
  • 链式语法调用
  • 可以控制下载的最大并发数
  • 线程安全

Requirements

  • iOS 8.0+
  • Xcode 9.0+
  • Swift 4.0+​

Installation

CocoaPods

CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:

$ gem install cocoapods

CocoaPods 1.1+ is required to build Tiercel.

To integrate Tiercel into your Xcode project using CocoaPods, specify it in your Podfile:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0' use_frameworks! target '<Your Target Name>' do pod 'Tiercel' end

Then, run the following command:

$ pod install

Manually

If you prefer not to use any of the aforementioned dependency managers, you can integrate Tiercel into your project manually.

Example

To run the example project, clone the repo, and run Example.xcodeproj from the Example directory.

Usage

最简单的用法

只需要简单的几行代码即可开启下载

let URLString = "http://120.25.226.186:32812/resources/videos/minion_01.mp4"
let downloadManager = TRManager() // 创建下载任务并且开启下载 downloadManager.download(URLString)

当然也可以对下载任务设置回调

downloadManager.download(URLString, fileName: "小黄人1.mp4", progressHandler: { (task) in let progress = task.progress.fractionCompleted print("下载中, 进度:\(progress)") }, successHandler: { (task) in print("下载完成") }) { (task) in print("下载失败") }

下载任务的管理和操作

// 创建下载任务并且开启下载,同时返回可选类型的TRDownloadTask对象,如果URLString无效,则返回nil
let task = downloadManager.download(URLString) // 根据URLString查找下载任务,返回可选类型的FCTask对象,如果不存在,则返回nil let task = downloadManager.fetchTask(URLString) // 开始下载 // 如果设置了downloadManager.isStartDownloadImmediately = false,需要手动开启下载 // 如果调用suspend暂停了下载,可以调用这个方法继续下载 downloadManager.start(URLString) // 暂停下载 downloadManager.suspend(URLString) // 取消下载,没有下载完成的任务会被移除,但保留没有下载完成的缓存文件 downloadManager.cancel(URLString) // 移除下载,已经完成的任务也会被移除,没有下载完成的缓存文件会被删除,已经下载完成的文件可以选择是否保留 downloadManager.remove(URLString, completely: false)

TRManager

TRManager是下载任务的管理者,管理所有下载任务,要使用Tiercel进行下载,必须要先创建TRManager对象。Tiercel没有设计成单例模式,因为一个APP可能会有多个不同的下载模块,开发者可以根据需求创建多个TRManager对象来进行下载。

///  初始化方法
///
/// - Parameters:
/// - name: 设置TRManager对象的名字,区分不同的下载模块,每个模块中下载相关的文件会保存到对应的沙盒目录 /// - MaximumRunning: 下载的最大并发数 /// - isStoreInfo: 是否把下载任务的相关信息持久化到沙盒,如果是,则初始化完成后自动恢复上次的任务 public init(_ name: String? = nil, MaximumRunning: Int? = nil, isStoreInfo: Bool = false) { // 实现的代码... }

开启下载任务,并且对其进行管理。Tiercel的设计理念是一个URLString对应一个下载任务,所有操作都必须通过TRManager对象进行,URLString作为下载任务的唯一标识。

let URLString = "http://120.25.226.186:32812/resources/videos/minion_01.mp4"
let downloadManager = TRManager() // 如果URLString无效,则返回nil let task = downloadManager.download(URLString, fileName: "小黄人1.mp4", progressHandler: { (task) in let progress = task.progress.fractionCompleted print("下载中, 进度:\(progress)") }, successHandler: { (task) in print("下载完成") }) { (task) in print("下载失败") } // 批量开启下载任务,返回有效URLString对应的任务数组,URLStrings需要跟fileNames一一对应 let tasks = downloadManager.multiDownload(URLStrings, fileNames: fileNames) // 根据URLString查找下载任务,返回可选类型的FCTask对象 // let task = downloadManager.fetchTask(URLString)  // 开始下载 // 如果设置了downloadManager.isStartDownloadImmediately = false,需要手动开启下载 // 如果调用suspend暂停了下载,可以调用这个方法继续下载 downloadManager.start(URLString) // 暂停下载 downloadManager.suspend(URLString) // 取消下载,没有下载完成的任务会被移除,但保留没有下载完成的缓存文件 downloadManager.cancel(URLString) // 移除下载,已经完成的任务也会被移除,没有下载完成的缓存文件会被删除,已经下载完成的文件可以选择是否保留 downloadManager.remove(URLString, completely: false)

TRManager也提供了对所有任务同时操作的API

downloadManager.totalStart()
downloadManager.totalSuspend()
downloadManager.totalCancel()
downloadManager.totalRemove(completely: false)

TRManager作为所有下载任务的管理者,也可以设置回调

// 回调闭包的参数都是TRManager对象,因为开发者可以通过TRManager对象得到任何相关的信息,把灵活度最大化
// 回调闭包都是在主线程运行
// progress 闭包:只要有一个任务正在下载,就会触发 // success 闭包:有两种情况会触发: // 1. 所有任务都下载成功(取消和移除的任务会被移除然后销毁,不再被manager管理) ,这时候manager.status == .completed // 2. 任何一个任务的状态都不是成功或者失败,且没有等待运行的任务,也没有正在运行的任务,这时候manager.status == .suspend // failure 闭包:有三种情况会触发: // 1. 每个任务的状态是成功或者失败,且有一个是失败的,这时候manager.status == .failed // 2. 调用全部取消的方法,或者剩下一个任务的时候把这个任务取消,这时候manager.status == .cancel // 3. 调用全部移除的方法,或者剩下一个任务的时候把这个任务移除,这时候manager.status == .remove downloadManager.progress { (manager) in let progress = manager.progress.fractionCompleted print("downloadManager运行中, 总进度:\(progress)") }.success { (manager) in if manager.status == .suspend { print("manager暂停了") } else if manager.status == .completed { print("所有下载任务都下载成功") } }.failure { (manager) in if manager.status == .failed { print("存在下载失败的任务") } else if manager.status == .cancel { print("manager取消了") } else if manager.status == .remove { print("manager移除了") } }

Tiercel的销毁

// 由于Tiercel是使用URLSession实现的,session需要手动销毁,所以当不再需要使用Tiercel也需要手动销毁
// 一般在控制器中添加以下代码
deinit { downloadManager.invalidate() }

TRManager的主要属性

// 设置内置日志打印等级,如果为none则不打印
public static var logLevel: TRLogLevel = .high // 设置是否创建任务后马上下载,默认为是 public var isStartDownloadImmediately = true // TRManager的状态 public var status: FCStatus = .waiting // TRManager的缓存管理对象 public var cache: TRCache // TRManager的进度 public var progress: Progress // 设置请求超时时间 public var timeoutIntervalForRequest = 30.0 // 所有下载中的任务加起来的总速度 public private(set) var speed: Int64 = 0 // 所有下载中的任务需要的剩余时间 public private(set) var timeRemaining: Int64 = 0 // manager管理的下载任务,取消和移除的任务会被销毁,不会在数组里,但操作是异步的,马上获取的tasks可能不正确 public var tasks: [FCTask] = []

TRCache

TRCache是Tiercel中负责管理缓存下载任务信息和下载文件的类。同样地,TRCache没有设计成单例模式,TRCache对象一般作为TRManager对象的属性来使用,如果需要跨控制器使用,那么只需要创建跟TRManager对象同样名字的TRCache对象即可操作对应模块的缓存信息和文件。

/// 初始化方法
///
/// - Parameters:
/// - name: 设置TRCache对象的名字,一般由TRManager对象创建时传递 /// - isStoreInfo: 是否把下载任务的相关信息持久化到沙盒,一般由TRManager对象创建时传递 public init(_ name: String, isStoreInfo: Bool = false) { // 实现的代码... }

主要属性

// 下载模块的目录路径
public let downloadPath: String // 没有完成的下载文件缓存的目录路径 public let downloadTmpPath: String // 下载完成的文件的目录路径 public let downloadFilePath: String

主要API分成几大类:

  • 检查沙盒是否存在文件

  • 移除跟下载任务相关的文件

  • 保存跟下载任务相关的文件

  • 读取下载任务相关的文件,获得下载任务相关的信息

TRDownloadTask

TRDownloadTask是Tiercel中的下载任务类,继承自FCTask。**Tiercel的设计理念是一个URLString对应一个下载任务,所有操作都必须通过TRManager对象进行,URLString作为下载任务的唯一标识。**所以TRDownloadTask对象都是由TRManager对象创建,单独创建没有意义。

主要属性

// 保存到沙盒的下载文件的文件名,如果在下载的时候没有设置,则默认使用url的最后一部分
public internal(set) var fileName: String // 下载任务对应的URLString public var URLString: String // 下载任务的状态 public var status: FCStatus = .waiting // 下载任务的进度 public var progress: Progress = Progress() // 下载任务的开始日期 public var startDate: TimeInterval = 0 // 下载任务的结束日期 public var endDate: TimeInterval = Date().timeIntervalSince1970 // 下载任务的速度 public var speed: Int64 = 0 // 下载任务的剩余时间 public var timeRemaining: Int64 = 0

下载任务的回调,可以在使用TRManager对象开启下载的时候设置,也可以在获得TRDownloadTask对象后进行设置

let task = downloadManager.fetchTask(URLString)// 回调闭包的参数都是TRDownloadTask对象,因为开发者可以通过TRDownloadTask对象得到任何相关的信息,把灵活度最大化
// 回调闭包都是在主线程运行 // progress 闭包:如果任务正在下载,就会触发 // success 闭包:任务已经下载过了,或者任务下载完成时,会触发 // failure 闭包:有三种情况会触发: // 1. 任务下载失败,这时候task.status == .failed // 2. 取消任务,这时候task.status == .cancel // 3. 移除任务,或者剩下一个任务的时候把这个任务移除,这时候manager.status == .remove task.progress { (task) in let progress = task.progress.fractionCompleted printLog("下载中, 进度:\(progress)") } .success({ (task) in printLog("下载完成") }) .failure({ (task) in if task.status == .failed { print("下载失败") } else if task.status == .cancel { print("取消任务") } else if task.status == .remove { print("移除任务") } })

对下载任务操作,必须通过TRManager对象进行,不能用TRDownloadTask对象直接操作

  • 开启
  • 暂停
  • 取消,会从TRManager对象中的tasks中移除,但保留没有下载完成的缓存文件
  • 移除,已经完成的任务也会被移除,没有下载完成的缓存文件会被删除,已经下载完成的文件可以选择是否保留

注意:取消和移除的任务会被销毁,会从TRManager对象的tasks中移除,但操作是异步的,马上获取的tasks可能不正确,在回调闭包里面获取的tasks才能保证正确

后台下载

如果需要开启后台下载,只需要在项目的info.plist中添加Required background modes -> App downloads content from the network

转载于:https://www.cnblogs.com/mkai/p/8631252.html

简单易用且功能丰富的纯Swift下载框架相关推荐

  1. d3.js 旋转图形_一个简单易用但功能强大的图形矢量化软件,扫描图片转换成CAD图的软件等等...

    背景简介 很多童鞋可能可能有想要把图片转成CAD能打开的格式,但是找不到软件,今天要分享的这个软件值得一试. 内容简介 AlgoLabR2VToolkit是一个将光栅图像转换为矢量图像的软件,转换后的 ...

  2. Qt怎么实现将bmp图片转换成Ascii_一个简单易用但功能强大的图形矢量化软件,扫描图片转换成CAD图的软件等等...

    背景简介 很多童鞋可能可能有想要把图片转成CAD能打开的格式,但是找不到软件,今天要分享的这个软件值得一试. 内容简介 AlgoLabR2VToolkit是一个将光栅图像转换为矢量图像的软件,转换后的 ...

  3. (强烈推荐)免费ERP-2BizBox为全球制造业企业提供的一款简单易用、功能齐全的ERP软件

    (强烈推荐)免费ERP-2BizBox为全球制造业企业提供的一款简单易用.功能齐全的ERP软件 2BizBox是为全球制造业企业提供的一款简单易用.功能齐全的ERP软件. 功能完善 2BizBox是针 ...

  4. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  5. simply-ellipsis简单易用,功能强大的tooltip工具

    简介 simply-ellipsis是纯原生技术实现的tooltip工具,具备以下功能 tooltip超出边界时自动调整其位置,保证提示框在视界内: 可配置单行是否超长才提示: 可配置多行提示: 可自 ...

  6. OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用。

    okhttp-OkGo 项目地址:jeasonlzy/okhttp-OkGo 简介:OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易 ...

  7. 【plupload】单易用且功能强大的上传组件

    前言 plupload是一款简单易用且功能强大的上传组件,有以下功能和特点: 拥有多种上传方式:HTML5.flash.silverlight以及传统的<input type="fil ...

  8. 简单易用的开源ORM框架SqlSugar v5.0.0.19源码

    介绍: SqlSugar是一款简单易用的开源ORM框架. 框架优点: 简单易用.功能齐全.高性能.轻量级.服务齐全 支持数据库:MySql.SqlServer.Sqlite.Oracle.postgr ...

  9. 一款简单易用的视频下载工具

    [公众号回复 "1024",免费领取程序员赚钱实操经验] 大家好,我是章鱼猫. 今天推荐的这个项目是「downkyi」,哔哩下载姬,一个简单易用的哔哩哔哩视频下载工具,支持批量下载 ...

最新文章

  1. mysql alter算法_MySQL ALTER命令_mysql alter_添加_删除_修改
  2. jQuery之事件绑定
  3. CheckedListBox与下拉框联动代码
  4. scrapy-redis 分布式学习记录
  5. dns服务器漏洞修复,KB4569509:DNS 服务器漏洞 CVE-2020-1350 指南
  6. 提升您的Hibernate引擎
  7. SAP License:固定资产减值的两种逻辑
  8. Centos 7安装报错:Warning:dracut-initqueue timeout - starting timeout scripts
  9. python解析xml数据_Python解析XML数据方法
  10. mysql 连续签到天数_瑞士军刀Redis(二)用户签到
  11. 05 mapABC示例 leo
  12. 虚拟服务器网络不通,VMware Workstation ping 不通的解决方法
  13. 鸟哥的linux私房菜-基础学习篇 读书笔记
  14. 老钓友分享蚯蚓钓鲤鱼配方
  15. val和var的区别
  16. 突破技术发展瓶颈、成功转型的重要因素
  17. 有道 - 词典在线发音API链接(日语)
  18. mysql中backup_mysql中的备份(backup)和恢复(recovery)
  19. 精读 Recommending Outfits from Personal Closet
  20. Mybatis——增删改查CLUD

热门文章

  1. 解析SharedPreferences
  2. Http和Https对比
  3. css伪类元素及选择器
  4. MTK前CFO喻铭铎分享经营智慧:山寨只是门票
  5. 【linux基础】重命名文件和文件夹
  6. DBUtils使用详解
  7. vuejs,angularjs,reactjs介绍
  8. 修改Idea默认的全局设置,如Maven等
  9. 2017.10.9 JVM入门学习
  10. ABAP动态创建数据DATA或对象Object