Future.swift
Future.swift
是 Swift 的 Futures 和 Promises 的实现。
亮点
- 规范性模式
- 丰富的特性
- 无与伦比的性能
- 实用 API
- 类型安全
性能测试
我使用的性能测试遵循 google/promises。对比的库包括 promises、PromiseKit、BrightFutures 和 Hydra。实际上,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