SwiftTaskLibrary 2.0.5

SwiftTaskLibrary 2.0.5

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2017年1月
SwiftSwift 版本3.0
SPM支持 SPM

Nicola Gallo 维护。



  • 作者
  • Nicola Gallo

SwiftTaskLibrary

什么是 SwiftTaskLibrary

它是 .net 的 TPLSwift 版本。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

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)
}