-
Notifications
You must be signed in to change notification settings - Fork 389
Tiercel 3.0 迁移指南
Tiercel 3.0 进行了大量的代码重构,大幅提高了性能,拥有更完善的错误处理,提供了更多方便的 API。尽管如此,总体的使用方法并没有发生重大的改变,开发者可以很容易进行升级。
如果之前有使用过 2.3.0 或者更新的版本,可以直接更新到 3.0.0 版本,再进行少量的改动即可完成升级;否则需要先升级到 2.4.1 作为过渡,原因会在后面具体说明。
- iOS 10.0+
- Xcode 11.0+
- Swift 5.0+
从 3.0.0 版本开始,Tiercel 改为最低支持 iOS 10.0,目前很多主流的 Swift 开源库都是如此,iOS 10.0 以下的使用者应该是非常少了,从 Xcode 11.0 开始也默认不支持 iOS 10.0 以下的模拟器,抛弃老旧的系统版本,可以更方便的使用新的 API,os_unfair_lock
就是其中一个。
而 Swift 则是一门非常年轻的语言,一直在快速发展,其实从 Swift 3 开始它的 API 改动已经不大,到了 Swift 5 ABI 稳定下来,所以 Tiercel 直接使用最新的 Swift 版本,方便使用最新的特性。
- 大幅提高
multiDownload(_:headersArray:fileNames:)
、totalSuspend(onMainQueue:handler:)
、totalCancel(onMainQueue:handler:)
、totalRemove(completely:onMainQueue:handler:)
等批量操作的速度 - 改用字典来匹配任务,提高
fetchTask(_:)
方法的性能 - 改用 iOS 中性能最高的锁
os_unfair_lock
进行线程同步 - 更完善的错误处理,任何错误都会打印出来
- 将
TiercelLog
改成struct Logger: Logable
,开发者可以取消所有的默认打印,也可以自定义Logger
- 修改部分属性名称和方法名称,更加规范
- 提高线程安全
-
Cache
支持自定义下载模块的文件夹 - 支持 iOS 13 的低数据模式访问限制和昂贵网络访问限制
- 支持改变单个任务在所有任务中的位置
- 支持对所有任务进行排序
- 增加直接对任务进行操作的API,如:
sessionManager.cancel(task)
Tiercel 3.0 内部代码改动很大,性能得到很大的提高,但是提供给外界使用的 API 却改动很小,所以只需从以下几个方面进行少量修改
在 2.3.0 版本以前,Tiercel 使用NSCoding
做编码解码,实现下载任务的持久化。从 2.3.0 版本开始,Tiercel 改用Codable
,更加安全。后续的版本 Tiercel 做了兼容处理,会先使用NSCoding
解码,然后就使用Codable
编码解码。考虑到这种情况已经持续很久,所以从 3.0.0 版本开始,移除对NSCoding
的兼容。如果之前有使用过 2.3.0 或者更新的版本,可以直接更新到 3.0.0 版本;否则需要先升级到 2.4.1 作为过渡。
在 Tiercel 2.0 中,SessionManager
提供了一些对DownloadTask
操作,如暂停、取消、删除、验证文件,这些方法最后一个参数都是闭包,作为操作完成后的回调,如下
public func cancel(_ url: URLConvertible, onMainQueue: Bool = true, _ handler: Handler<DownloadTask>? = nil)
最后一个闭包是可选类型,并且默认为nil
,同时省略了外部参数名称,为了使这些方法变得更加规范,在 Tiercel 3.0 中不再省略这个闭包参数的外部参数名称,如下:
public func cancel(_ url: URLConvertible, onMainQueue: Bool = true, handler: Handler<DownloadTask>? = nil)
这样最后一个参数就是尾随闭包,调用的时候可以写成这样:
sessionManager?.cancel(URLString) { task in
// 具体操作
}
当然,如果你在 Tiercel 2.0 已经是这样写,那么将无需任何改动
旧版本提供了一个全局方法TiercelLog(_:identifier:url:file:line:)
,可以方便的打印调试日志。但为了代码更加简洁,日志模块化,新版本移除了这个方法。
作为替代,Tiercel 3.0 SessionManager
的初始化方法中增加了一个Logable
类型参数
public init(_ identifier: String,
configuration: SessionConfiguration,
logger: Logable? = nil,
cache: Cache? = nil,
operationQueue: DispatchQueue = DispatchQueue(label: "com.Tiercel.SessionManager.operationQueue")) {
// ....
}
开发者可以遵守Logable
协议,自定义一个logger
public enum LogOption {
case `default`
case none
}
public enum LogType {
case sessionManager(_ message: String, manager: SessionManager)
case downloadTask(_ message: String, task: DownloadTask)
case error(_ message: String, error: Error)
}
public protocol Logable {
var identifier: String { get }
var option: LogOption { get set }
func log(_ type: LogType)
}
如上面所示,static var logLevel: LogLevel
已经改成LogOption
类型集成到Logable
中
而同样为了模块化,static var isControlNetworkActivityIndicator: Bool
也改为SessionManager
的实例属性。
为了避免歧义,var completedTasks: [DownloadTask]
改成var succeededTasks: [DownloadTask]
Tiercel 3.0 为了让外界更方便地使用下载信息,分别在SessionManager
和DownloadTask
中增加了各种下载信息的String
类型版本计算属性,原来的属性也保留下来,因此也无需进行改动,开发者可以用原来的属性生成其他格式的String
以上应该包含了所有迁移到 Tiercel 3.0 需要进行的修改,如果还有的话,应该也可以借助编译器的警告提示来进行修改。当然,实在还有问题,你也可以向我发问