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 在某个后台队列中执行耗时的计算。
可以通过 get
和 wait
方法观察 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
允许以下转换
此运算符创建一个新的 Future
,该 Future 报告转换后的结果。它具有以下几种形式
map
: func map<T>(_ transform: @escaping (Result<Success, Failure>) -> Result<NewSuccess, Failure>) -> Future<NewSuccess, Failure>
mapSuccess()
: func mapSuccess<NewSuccess>(_ transform: @escaping (Success) -> NewSuccess) -> Future<NewSuccess, Failure>
mapFailure()
: func mapFailure(_ transform: @escaping (Failure) throws -> Success) -> Future<Success, Failure>
此运算符允许指定 future 的延续。 -flatMap
: func flatMap<NewSuccess>(_ transform: @escaping (Result<Success, Failure>) -> Future<NewSuccess, Failure>) -> Future<NewSuccess, Failure>
flatMapValue()
: func flatMapSuccess<NewSuccess>(_ transform: @escaping (Success) -> Future<NewSuccess, Failure>) -> Future<NewSuccess, Failure> {
flatMapFailure()
: func flatMapFailure(_ transform: @escaping (Failure) -> Future) -> Future<Success, Failure>
创建一个 future,该 future 会重试 worker,直到成功或失败指定的次数为止 func retry(_ times: Int) -> Future<Success, Failure>
创建一个 future,该 future 会保留接收到的值结果。 后续的观察者注册将收到相同的结果,而不会触发新的 worker 执行。 func keep() -> Future<Success, Failure>
创建一个 future,该 future 会等待所有其他 future 完成。 如果其中一个失败,它会立即报告该失败 static func when(all futures: [Future]) -> Future<[Success], Failure>
创建一个 future,该 future 会报告第一个成功的 future 的成功,或者如果所有 future 都失败,则报告最后一个失败的 future 的错误 static func when(firstOf futures: [Future]) -> Future
Suture 可以通过 CocoaPods 获得。 要安装它,只需将以下行添加到你的 Podfile 中
pod 'Suture'
cristik
Suture 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。