Swift 结合 return 第一个未来在第二个评估后的结果
Swift Combine return result of first future after evaluation of second
我有以下情况:
2个期货,一个returns一个我感兴趣的值,另一个做一些操作,returns作废。两者互不相关(因此代码不应混用),但两者都需要在应用程序逻辑中以正确的顺序执行。
我想订阅执行以下操作的发布者:
- 未来一个执行并给出一个值
- 未来两次执行并且returns什么都没有
- 订阅者在执行未来二后收到未来一的值。
这是一个无法编译的小代码示例,显示了我想要实现的目标:
import Combine
func voidFuture() -> Future<Void, Error> {
return Future<Void, Error> { promise in
promise(.success(()))
}
}
func intFuture() -> Future<Int, Error> {
return Future<Int, Error> { promise in
promise(.success(1))
}
}
func combinedFuture() -> AnyPublisher<Int, Error> {
var intValue: Int!
return intFuture().flatMap { result in
intValue = result
return voidFuture()
}.flatMap{ _ in
return CurrentValueSubject(intValue).eraseToAnyPublisher()
}.eraseToAnyPublisher()
}
var subscriptions = Set<AnyCancellable>()
combinedFuture()
.sink(receiveCompletion: { _ in }, receiveValue: { val in print(val)})
.store(in: &subscriptions)
你需要.map
第二个发布者(voidFuture
)的Void
结果返回到第一个发布者(intFuture
)的结果,这就是.flatMap
会发出:
func combinedFuture() -> AnyPublisher<Int, Error> {
intFuture().flatMap { result in
voidFuture().map { _ in result }
}
.eraseToAnyPublisher()
}
我有以下情况:
2个期货,一个returns一个我感兴趣的值,另一个做一些操作,returns作废。两者互不相关(因此代码不应混用),但两者都需要在应用程序逻辑中以正确的顺序执行。
我想订阅执行以下操作的发布者:
- 未来一个执行并给出一个值
- 未来两次执行并且returns什么都没有
- 订阅者在执行未来二后收到未来一的值。
这是一个无法编译的小代码示例,显示了我想要实现的目标:
import Combine
func voidFuture() -> Future<Void, Error> {
return Future<Void, Error> { promise in
promise(.success(()))
}
}
func intFuture() -> Future<Int, Error> {
return Future<Int, Error> { promise in
promise(.success(1))
}
}
func combinedFuture() -> AnyPublisher<Int, Error> {
var intValue: Int!
return intFuture().flatMap { result in
intValue = result
return voidFuture()
}.flatMap{ _ in
return CurrentValueSubject(intValue).eraseToAnyPublisher()
}.eraseToAnyPublisher()
}
var subscriptions = Set<AnyCancellable>()
combinedFuture()
.sink(receiveCompletion: { _ in }, receiveValue: { val in print(val)})
.store(in: &subscriptions)
你需要.map
第二个发布者(voidFuture
)的Void
结果返回到第一个发布者(intFuture
)的结果,这就是.flatMap
会发出:
func combinedFuture() -> AnyPublisher<Int, Error> {
intFuture().flatMap { result in
voidFuture().map { _ in result }
}
.eraseToAnyPublisher()
}