Suture
Suture
仅在 Swift 5.0 及以上版本上运行,对于 Swift 4.x 版本请使用 vesion 0.2.2
重要 当前版本的 介绍
Future
是围绕异步计算的一个薄的包装器,该计算可能是异步的,可能花费更多或更少的时间。
通过初始化一个执行计算的闭包来创建一个 Future
,并通知计算何时完成
let future = Future<Int, Error> { resolver in resolver(.value(19)) }
上面的代码创建了一个将值 19 解析的 Future
Future 报告 Result
实例,因此需要将 Result
实例传递给解析器。Future 的失败可以通过 failure
情况报告。
另一个例子
let future = Future<String, Error> { resolver in resolver(.value(expensiveComputation())) }.working(on: someDispatchQueue) }
上面的 Future
在后台队列上执行昂贵的计算。
观察
可以通过 get
和 wait
方法观察 Future
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
可能不会始终异步地报告未来的结果。该方法的行为取决于工作者如何提供结果。此外,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)") })
上述代码输出 "值:3"
其他
查看 Cocoa+Suture
了解一些基础功能
转换
《Future》允许以下转换
map()
此操作符创建一个新的 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>
flatMap()
此操作符允许对未来的指定关闭调用。 -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>
retry()
创建一个将重试工作器,直到成功或失败指定次数的future func retry(_ times: Int) -> Future
keep()
创建一个future,它保留接收到的值结果。随后的观察者注册将接收相同的结果,而不会触发新的工作执行。 func keep() -> Future
when(all):
创建一个等待所有其他future完成的future。如果其中一个失败,则立即报告失败 static func when(all futures: [Future]) -> Future<[Success], Failure>
when(firstOf):
创建一个future,如果第一个future成功,则报告其成功,或者如果所有都失败,则报告最后一个失败future的错误 static func when(firstOf futures: [Future]) -> Future
安装
Suture通过CocoaPods可用。要安装它,只需将以下行添加到您的Podfile中
pod 'Suture'
作者
cristik
许可协议
缝合线可在MIT许可下使用。更多信息请查看LICENSE文件。