赞
踩
Combine 系列
目的:使用 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()
promise
。 它给出一个与类型描述相匹配的 Result 对象,你可以与之交互。promise(.failure(<FailureType>))
的调用返回一个失败的结果。promise(.success(<OutputType>))
返回一个值。Future 在创建时立即发起其中异步 API 的调用,而不是 当它收到订阅需求时。 这可能不是你想要或需要的行为。 如果你希望在订阅者请求数据时再发起调用,你可能需要用 Deferred 来包装 Future。
如果您想返回一个已经被解析的 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()
https://heckj.github.io/swiftui-notes/index_zh-CN.html
https://github.com/heckj/swiftui-notes
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。