一個很是簡單易用且功能豐富的純Swift下載框架-Tiercel

項目地址:github.com/Danie1s/Tie…

Tiercel

Tiercel是一個很是簡單易用且功能豐富的純Swift下載框架。最大的特色就是擁有強大的任務管理功能和能夠直接獲取常見的下載信息,而且只要加上一些簡單的UI,就能夠實現一個下載類APP的大部分功能。ios

Features:

  • [x] 支持大文件下載
  • [x] 支持離線斷點續傳,APP關閉後依然能夠恢復全部下載任務
  • [x] 每一個下載任務均可以單獨管理操做
  • [x] 每一個下載任務和manager都有進度回調、成功回調和失敗回調
  • [x] 棄用單例模式,APP裏面能夠有多個manager,能夠根據須要區分不一樣的下載模塊
  • [x] 內置了常見的下載信息,而且能夠選擇是否持久化下載任務信息
  • [x] 支持後臺下載
  • [x] 鏈式語法調用
  • [x] 能夠控制下載的最大併發數
  • [x] 線程安全

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:git

$ gem install cocoapods
複製代碼

CocoaPods 1.1+ is required to build Tiercel.github

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

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.xcode

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)
複製代碼

固然也能夠對下載任務設置回調ruby

downloadManager.download(URLString, fileName: "小黃人1.mp4", progressHandler: { (task) in
    let progress = task.progress.fractionCompleted                                                                        
    print("下載中, 進度:\(progress)")
}, successHandler: { (task) in
    print("下載完成")
}) { (task) in
    print("下載失敗")
}
複製代碼

下載任務的管理和操做bash

// 建立下載任務而且開啓下載,同時返回可選類型的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

License

Tiercel is available under the MIT license. See the LICENSE file for more info.

相關文章
相關標籤/搜索