Suture

CI Status Version License Platform

重要提示:当前版本的 Suture 仅适用于 Swift 5.0 及以上版本。对于 Swift 4.x,请使用 0.2.2 版本。

简介

Future 是一个对计算的简单封装,该计算可能是异步的,也可能不是,并且可能需要较少或较多的时间。

通过使用执行计算的闭包初始化 Future 来创建它,并在计算完成时发出通知。

let future = Future<Int, Error> { resolver in resolver(.value(19)) }

以上代码创建了一个被解析为值 19 的 future。

Futures 报告 Result 实例,因此需要将 Result 实例传递给解析器。 future 的失败可以通过 failure case 进行报告。

另一个例子

let future = Future<String, Error> { resolver in resolver(.value(expensiveComputation())) }.working(on: someDispatchQueue) }

上面的 future 在某个后台队列中执行耗时的计算。

观察

可以通过 getwait 方法观察 Futures。

future.get { result in
    switch result {
    case let .value(value): print("Success: \(value)")
    case let .error(error): print("Error: \(error)")    
    }
}

// or synchronously
let result = future.wait()

存在一些便捷方法,用于仅观察成功或失败。

future
    .get(onValue: { print("Success: \($0)") }
         onError: { print("Error: \($0)") })

注意get 方法可能不会始终以异步方式报告 future 的结果。该方法的行为取决于 worker 如何提供结果。 此外,如果想要确保在特定线程上运行,get 闭包不能保证在调用者线程上运行,你需要使用 notifying(on:)

例子

let future = Future<Double, Error> { resolver in
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { resolver(.value(9)) }
    return Cancelable()
    }
    .mapValue(sqrt)
    .get(onValue: { print("Value: \($0)") })

以上代码打印 "Value: 3"

其他

查看 Cocoa+Suture 获取一些 Foundation 相关的内容。

转换

Future 允许以下转换

map()

此运算符创建一个新的 Future,该 Future 报告转换后的结果。它具有以下几种形式

flatMap()

此运算符允许指定 future 的延续。 -flatMap: func flatMap<NewSuccess>(_ transform: @escaping (Result<Success, Failure>) -> Future<NewSuccess, Failure>) -> Future<NewSuccess, Failure>

retry()

创建一个 future,该 future 会重试 worker,直到成功或失败指定的次数为止 func retry(_ times: Int) -> Future<Success, Failure>

keep()

创建一个 future,该 future 会保留接收到的值结果。 后续的观察者注册将收到相同的结果,而不会触发新的 worker 执行。 func keep() -> Future<Success, Failure>

when(all:)

创建一个 future,该 future 会等待所有其他 future 完成。 如果其中一个失败,它会立即报告该失败 static func when(all futures: [Future]) -> Future<[Success], Failure>

when(firstOf:)

创建一个 future,该 future 会报告第一个成功的 future 的成功,或者如果所有 future 都失败,则报告最后一个失败的 future 的错误 static func when(firstOf futures: [Future]) -> Future

安装

Suture 可以通过 CocoaPods 获得。 要安装它,只需将以下行添加到你的 Podfile 中

pod 'Suture'

作者

cristik

许可证

Suture 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。