我们的应用程序不断进行工作。您对用户输入的反应越快,生成的输出越快,用户继续使用您的应用程序的可能性就越大。随着我们的应用程序变得更加复杂,需要完成的工作越来越多。您需要开始思考如何对工作进行分类和优化,如何使这项工作更高效、更优化,最终,更快。在大多数情况下,结果并不理想,因为您需要了解很多关于并发、多线程等方面的知识 - 这是一个非常复杂的领域。您在能够编写任何东西之前,需要了解所有的API特性。
Overdrive就是为了解决这个难题而创建的。它是一个框架,暴露了几个简单的概念,这些概念是基于复杂的系统框架构建的,这些框架使得多线程、并发以及最重要的速度提升成为可能。
let task = URLSessionTask(url: "https://api.swiftable.io")
task
.retry(3)
.onValue { json in
print(json["message"])
}.onError { error in
print(error)
}
TaskQueue.background.add(task: task)
8.0+
8.0+
10.11+
9.0+
2.0+
platform :ios, '8.0'
use_frameworks!
target 'Your App Target' do
pod 'Overdrive', '~> 0.2'
end
import PackageDescription
let package = Package(
name: Your Package Namepl-pds>
,
dependencies: [
.Package(url: https://github.com/arikis/Overdrive.gitpl-pds>
,
majorVersion: 0,
minor: 2)
]
)
Overdrive
也可以通过拖动 Overdrive.xcodeproj
到项目中,并在项目设置中将 Overdrive.framework
添加到嵌入的库来手动安装。
Overdrive 有两个主要类
工作流程
Task<T>
的子类run()
方法并封装任何同步或异步操作finish(with:)
方法通过 value(T)
或 error(Error)
完成TaskQueue
示例:用于图片下载任务的 Task<UIImage>
子类
class GetLogoTask: Task<UIImage> {
override func run() {
let logoURL = URL(string: https://swiftable.io/logo.pngpl-pds>
)!
<span class="pl-k">do</span> {
<span class="pl-k">let</span> logoData <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-c1">Data</span>(<span class="pl-c1">contentsOf</span>: logoURL)
<span class="pl-k">let</span> image <span class="pl-k">=</span> <span class="pl-c1">UIImage</span>(<span class="pl-c1">data</span>: logoData)<span class="pl-k">!</span>
<span class="pl-c1">finish</span>(<span class="pl-c1">with</span>: .<span class="pl-c1">value</span>(image)) <span class="pl-c"><span class="pl-c">//</span> Finish with image</span>
} catch { finish(with: .error(error)) // Finish with error if any } } }
要设置完成块,请使用 onValue
和 onError
方法
let logoTask = GetLogoTask()
logoTask
.onValue { logo in
print(logo) // UIImage object
}.onError { error in
print(error)
}
要执行任务,请将其添加到 TaskQueue
的实例中
let queue = TaskQueue()
queue.add(task: logoTask)
TaskQueue
默认并发执行任务。最大并发操作数由当前系统条件定义。如果你想限制最大并发任务执行的数目,请使用 maxConcurrentTaskCount
属性。
let queue = TaskQueue()
queue.maxConcurrentTaskCount = 3
所有任务属性默认情况下都是线程安全的,这意味着你可以从任何线程或队列访问它们,不必担心锁定和访问同步。
Overdrive
框架深受 Apple WWDC 视频中的演讲和代码的启发。
Overdrive
是指在电子吉他演奏中,当吉他放大器(管)开始产生过载、几乎失真的声音时使用的效果,这是因为增加了增益(主音量)设置。
本节定义了 Overdrive 一些长期的计划。它们尚未安排实施或指定特定版本。
Foundation.Operation
的依赖目前,Overdrive 利用 Foundation.Operation
和 Foundation.OperationQueue
类进行并发和执行。虽然这些类提供了出色的功能,但它们仍然是其 Objective C 对应物(NSOperation
和 NSOperationQueue
)的重新编写。这意味着编写 Task<T>
需要很多覆盖和状态管理。
例如,任何任务子类都必须重写 run()
方法以定义执行点。如果没有重写该方法,队列将执行断言来通知应覆盖此方法。如果调用了 super.run()
,也将发生同样情况。
将来,Overdrive 应仅使用 libdispatch
实现其功能。