前面我们用过Just
,其数据的发布和订阅是同步行为。如果希望数据的发布和订阅是异步的,可以使用Future
。Future
可以创建一个接收未来数据与事件的 Publisher。Future
定义如下:
final public class Future<Output, Failure> : Publisher where Failure : Error {
public typealias Promise = (Result<Output, Failure>) -> Void
public init(_ attemptToFulfill: @escaping (@escaping Future<Output, Failure>.Promise) -> Void)
final public func receive<S>(subscriber: S) where Output == S.Input, Failure == S.Failure, S : Subscriber
}
从上面的定义可以看出,其本质是(Result<Output, Failure>) -> Void
的类型别名,它表示 Future 的最终结果。
import UIKit
import Combine
let future = Future<Int, Never> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
promise(.success(100))
}
}
let subscription = future.sink(receiveValue: { value in
print(value)
})
import UIKit
import Combine
struct SomeError: Error {
}
let future = Future<Int, SomeError> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
promise(.failure(SomeError()))
}
}
let subscription = future.sink(receiveCompletion: { completion in
if case .failure(let error) = completion {
// 失败的处理
print(error)
}
}, receiveValue: { _ in
// 成功的处理
})
import Combine
// 返回一个Future对象且会产生一个Int类型的值
func createFuture() -> Future<Int, Never> {
// 返回一个Future,它是一个闭包
// 在该闭包里执行异步操作,只会执行一次
return Future { promise in
// 异步操作
// 最后必须调用promise完成工作
promise(.success(100))
}
}
createFuture().sink(receiveValue: { value in
print(value)
})
/*输出
100
*/