测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布上次发布 | 2017年1月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Nicola Gallo 维护。
它是 .net 的 TPL
的 Swift
版本。TPL 的目的是通过简化为应用程序添加并行性和并发性的过程来提高开发者的生产效率。
Task
Task
代表由 TaskFactory
类创建并启动的异步操作。
TaskFactory
类实现以下方法
startSync
: 以同步方式启动一个 Task
startAsync
: 以异步方式启动一个 Task
startAfter
: 在指定数量的毫秒后异步启动一个 Task
TaskFactory.startAsync(TaskScheduler.background()) {
return "Hello World!"
}
可以定义一个在 Task
完成时异步执行的延续到创建的 Task
。
let task = TaskFactory.startAsync(TaskScheduler.background()) {
return "Hello World!"
}
task.continueWith(TaskScheduler.ui()) {
[unowned self] task in
println(task.result ?? "NO RESULT")
}
TaskCompletionSource 代表一个未绑定到代理的 Task
的生产方,通过 Task
属性提供对消费方的访问。
它是一个创建任务和该任务完成的源。本质上,TaskCompletionSource 作为 Task
和其完成的生成者。
当您无法控制异步操作(例如操作由第三方库启动)时,使用 TaskCompletionSource 非常方便。
//Creates a new CancellationTokenSource
let cTokenSource = CancellationTokenSource()
//Defines a task continuation on the task created by the CancellationTokenSource
cTokenSource.task.continueWith(TaskScheduler.ui()) {
[unowned self] task in
println(task.result ?? "NO RESULT")
}
//Code that is not using `Task` to create the asynchronus operation
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
println("TaskCompletionSource - Running")
sleep(5)
// Complete the task created by the CancellationTokenSource
tcs.setResult(self.getResult("TaskCompletionSource - Completed"))
}
关注点的分离减少了耦合,并增加了应用程序的内聚性。
关注点的分离的一个例子是 DAL
(数据访问层)。DAL
是一个层,通过它提供了对存储在持久存储中数据的简化访问。
DAL
由于性能 I/O 操作,所以必须是异步的。
下面是一个可能的 Api
示例。
示例 1 - DataAccessLayer 协议
public protocol DataAccessLayer {
func getOrders(success:([Order]) -> Void, failure:(NSError) -> Void))
}
为了使用 DataAccessLayer,必须传入两个闭包。
以下是一个使用 DAL
并在异步操作完成后在 UI 线程上执行操作的代码示例。
示例 2 - DataAccessLayer 的使用
let dal = OrdersDataAccessLayer()
dal.getOrders({
orders in
dispatch_sync(dispatch_get_main_queue(), {
() -> Void in
update(orders)
})
},
failure: {
error in
dispatch_sync(dispatch_get_main_queue(), {
() -> Void in
log(error)
})
})
使用 SwiftTaskLibrary,DAL
代码将如下实现。
示例 3 - DataAccessLayer 协议
public protocol DataAccessLayer {
func getOrdersAsync() -> Task<[Order]>
}
示例 3 - DataAccessLayer 的使用
let dal = OrdersDataAccessLayer()
dal.getOrdersAsync()
.continueWith(TaskScheduler.ui()) {
task in
if (task.isFaulted) {
log(task.error)
return
}
update(task.result)
}