Suture 0.3.0

Suture 0.3.0

Cristian Kocza 维护。



Suture 0.3.0

  • 作者
  • cristik

Suture

CI Status Version License Platform

重要 当前版本的 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 在后台队列上执行昂贵的计算。

观察

可以通过 getwait 方法观察 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文件。