为什么 Empty Publisher 在 Combine 中不触发完成事件?

Why Empty Publisher not trigger completion event in Combine?

我们知道Combine中的Empty Publisher会立即触发完成事件:

Empty<Void,Never>()
    .sink {
        print("completion: \([=10=])")  // will print!
    } receiveValue: {}

但是flatMap返回的Empty Publisher不会触发完成事件:

var subs = Set<AnyCancellable>()
let p0 = PassthroughSubject<[Int],Error>()
let p1 = p0
    .flatMap {_ in
        Empty<Void,Never>() // same Empty Publisher
    }.eraseToAnyPublisher()

p1
    .sink {
        print("completion: \([=11=])")  // but NOT print!
    } receiveValue: {}
    .store(in: &subs)

p0.send([1,2,3])

这是为什么???我想念什么吗???谢谢! ;)

FlatMap 以下列方式工作:它为每个上游值创建一个发布者。下游接收所有这些 FlatMap 创建的发布者发出的所有值。

它在上游完成时完成,或者如果上游出错,或者任何创建的发布者出错,则出错。

因此,在您的情况下,对于 [1,2,3] 的单个上游值,您发出一个 Empty 发布者(完成),但没有整体完成,因为 PassthroughSubject 还没有完成。

p0.send([1,2,3])
p0.send(completion: .finished)

以上将完成整个流水线。