Future.swift 0.0.1

Future.swift 0.0.1

jianstm 维护。



  • 作者:
  • Quentin Jin

Future.swift

Future.swift 是 Swift 的 Futures 和 Promises 的实现。

亮点

  • 规范性模式
  • 丰富的特性
  • 无与伦比的性能
  • 实用 API
  • 类型安全

性能测试

我使用的性能测试遵循 google/promises。对比的库包括 promisesPromiseKitBrightFuturesHydra。实际上,promises 是用 Objective-C 实现的,但这无关紧要。

更多详细信息请查看 benchmark/benchmark.xcodeporj

创建已解析的 promise、链式操作 1/2/3 个 block 并在串行队列中进入最后一个链式 block 所需要的时间平均值(测量 10,000 次)。

在并发队列中解决 10,000 个挂起的 promise 并等待控制进入每个 block 所需要的时间平均值。

用法

Future.swift 的 API 非常友好,这里有一个真实世界的示例

func fetch(_ str: String) -> Future<HTTPResponse, HTTPError> {
    guard let url = URL(string: str) else {
        return .failure(.invalidURL(str))
    }

    let p = Promise<HTTPResponse, HTTPError>()
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let e = error {
            p.fail(HTTPError.session(e))
            return
        }
        p.succeed(HTTPResponse(response, data)) 
    } 
    return p.future
}

let img = "https://cdn.io/me.png"
fetch(img)
    .validate {
        $0.status.isValid()
    }
    .userInitiated()
    .tryMap { 
        try ImageDecoder().decode($0.data)
    }
    .main { 
        self.imageView = $0
    }
    .background { 
        cache.add($0, for: img)
    }
    .catch { 
        Log.error($0)
    }

Future.swift 的核心接口非常简单,它只包含大约 7 个 API。

未来

未来表示异步操作的最终结果。

  • isPending:如果未来对象正在等待,则返回 true。

  • isCompleted:如果未来对象已完成,则返回 true。

  • inspect():原子地检查未来对象,如果未来对象正在等待,则返回 nil。

  • inspectRoughly():非原子地检查未来对象,如果未来对象正在等待,则返回 nil。

  • whenComplete(_ callback: @escaping (Result<Success, Failure>) -> Void):在完成时向未来对象添加回调。

承诺

承诺负责管理未来的状态。

let p = Promise<Result, Error>()

DispatchQueue.background {
    do {
        let r = try task()
        p.succeed(r)
    } catch let e {
        p.fail(e)
    }
}

p.future

特性

Future.swift 提供了 30 多种方法来增强未来的功能

  • always
  • and
  • any
  • asAny
  • asVoid
  • catch
  • delay
  • done
  • finally
  • flat
  • flatMap
  • hush
  • map
  • mute
  • pipe
  • race
  • recover
  • reduce
  • retry
  • return
  • some
  • tap
  • then
  • timeout
  • validate
  • wait
  • yield
  • whenAll
  • whenAny
  • ...

详细的文档仍在编写中,如果有好的新主意,欢迎贡献!

安装

dependencies: [
    .package(url: "https://github.com/luoxiu/Future.swift", from: "2.0.0")
]

待办事项

  • 文档(需要帮助)
  • 测试(目前 60% +)
  • API 参考
  • 发布 0.0.1(希望这个周末)
  • FutureSwift社区

许可证

MIT