Futures

Tests

Futures 是一个用于简化异步编程的跨平台框架,使用 Swift 编写。它轻量级、快速且易于理解。

支持的平台

架构

从根本上讲,Futures 是一个非常简单的框架,由两种类型组成:

在许多 Promise 框架中,Promise 与 Future 没有区别。 这引入了 Promise 的可变性,Promise 被传递。 在 Futures 中,Future 是可观察的值,而 Promise 是设置值的函数。

默认情况下,Futures 在单个并发分发队列上被观察。 可以通过将不同的队列分配给 DispatchQueue.futures 来修改此队列。 您还可以为添加到 Future 的每个回调指定您选择的队列。

一个 Future 被认为是:

用法

当函数返回一个 Future<Value> 时,您可以选择直接观察它,或者继续执行更多的异步任务。 对于观察,您可以使用:

如果根据第一个 Future 的结果,您有更多异步工作要做,您可以使用:

请注意,您可以为所有这些函数指定一个观察分发队列。 例如,您可以使用 flatMap(on: .main).map(on: .global())。 默认情况下,队列是 DispatchQueue.futures

作为一个简单的例子,以下是一些代码的可能外观:

let future = loadNetworkResource(
    from: URL("http://someHost/resource")!
).flatMapThrowing { data in
    try jsonDecoder.decode(SomeType.self, from: data)
}.always {
    someFunctionToExecuteRegardless()
}

future.whenFulfilled(on: .main) { someType in
    // Success
}

future.whenRejected(on: .main) { error in
    // Error
}

要创建返回 Future<T> 的函数,您需要创建一个新的待处理 Promise,并在适当的时候解析它。

func performAsynchronousWork() -> Future<String> {
    let promise = Promise<String>()

    DispatchQueue.global().async {
        promise.fulfill(someString)

        // If error
        promise.reject(error)
    }

    return promise.future
}

您也可以使用简写。

promise {
     try jsonDecoder.decode(SomeType.self, from: data)
} // Future<SomeType>

或者可以从异步返回的简写。

promise(String.self) { completion in
    /// ... on success ...
    completion(.fulfill("Some string"))
    /// ... if error ...
    completion(.reject(anError))
} // Future<String>

文档

完整的文档可以在这里找到。

入门

可以使用 Carthage 或 Swift 包管理器将 Futures 添加到您的项目中。

如果您想在您的项目中依赖 Futures,只需在您的 Package.swift 中添加一个 dependencies 子句即可

dependencies: [
    .package(url: "https://github.com/davidask/Futures.git", from: "1.6.0")
]

或者,在您的 Cartfile 中添加一个依赖项

github "davidask/Futures"

有关使用 Carthage 的更多详细信息,请访问 这里

最后,在您的 Swift 文件中导入模块

import Futures

贡献

欢迎大家为 Futures 做出贡献,更多信息请查看 LICENSE 文件。

致谢

David Ask