- 目的
-
-
使用
Future
将异步请求转换为发布者,以便在 Combine 管道中使用返回结果。
-
- 参考
- 另请参阅
- 代码和解释
import Contacts
let futureAsyncPublisher = Future<Bool, Error> { promise in (1)
CNContactStore().requestAccess(for: .contacts) { grantedAccess, err in (2)
// err is an optional
if let err = err { (3)
return promise(.failure(err))
}
return promise(.success(grantedAccess)) (4)
}
}.eraseToAnyPublisher()
-
Future
本身由你定义返回类型,并接受一个闭包。 它给出一个与类型描述相匹配的Result
对象,你可以与之交互。 -
只要传入的闭包符合类型要求,任何异步的 API 你都可以调用。
-
在异步 API 完成的回调中,由你决定什么是失败还是成功。 对
promise(.failure(<FailureType>))
的调用返回一个失败的结果。 -
或者调用
promise(.success(<OutputType>))
返回一个值。
Note
|
如果您想返回一个已经被解析的 promise 作为 Future
发布者,你可以在闭包中立即返回你想要的结果。
以下示例将单个值 true
返回表示成功。
你同样可以简单地返回 false
,发布者仍然会将其作为一个成功的 promise。
let resolvedSuccessAsPublisher = Future<Bool, Error> { promise in
promise(.success(true))
}.eraseToAnyPublisher()
一个返回 Future
发布者的例子,它立即将 promise 解析为错误。
enum ExampleFailure: Error {
case oneCase
}
let resolvedFailureAsPublisher = Future<Bool, Error> { promise in
promise(.failure(ExampleFailure.oneCase))
}.eraseToAnyPublisher()