【发布时间】:2021-08-28 08:36:17
【问题描述】:
我有一些这样的代码
func a() -> AnyPublisher<Void, Never> {
Future<Void, Never> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
print(1)
promise(.success(()))
}
}
.eraseToAnyPublisher()
}
func b() -> AnyPublisher<Void, Never> {
Future<Void, Never> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
print(2)
promise(.success(()))
}
}
.eraseToAnyPublisher()
}
var tempBag = Set<AnyCancellable>()
let subject = CurrentValueSubject<Int, Never>(1)
subject
.flatMap({ _ in a() })
.flatMap({ _ in b() })
.print()
.sink(receiveCompletion: { _ in
tempBag.removeAll()
}, receiveValue: { })
.store(in: &tempBag)
所以,我在流的根目录中有一些无法完成的主题,在 flatMap 运算符中有一些可完成的发布者。我希望在最后一个 flatMap 的发布者完成时完成整个流。所以,我希望控制台看起来像这样:
receive subscription: (FlatMap)
request unlimited
1
2
receive value: (())
receive finished
但实际结果是
receive subscription: (FlatMap)
request unlimited
1
2
receive value: (())
我怎样才能做到这一点?
【问题讨论】:
-
您知道
flatMap的行为方式吗?您似乎误解了它的工作原理。flatMap(f)将其上游发布的 每个 元素x替换为发布者f(x)发布的所有元素。因此,如果flatMap的上游从未完成,则它永远不会完成。如果你只想要 1 个元素,在最后一个flatMap之后添加prefix(1)怎么样?