为什么空发布器不触发组合中的完成事件?

hop*_*opy 4 publisher swift combine

我们知道Combine中的Empty Publisher会立即触发完成事件\xef\xbc\x9a

\n
Empty<Void,Never>()\n    .sink {\n        print("completion: \\($0)")  // will print!\n    } receiveValue: {}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
var subs = Set<AnyCancellable>()\nlet p0 = PassthroughSubject<[Int],Error>()\nlet p1 = p0\n    .flatMap {_ in\n        Empty<Void,Never>() // same Empty Publisher\n    }.eraseToAnyPublisher()\n\np1\n    .sink {\n        print("completion: \\($0)")  // but NOT print!\n    } receiveValue: {}\n    .store(in: &subs)\n\np0.send([1,2,3])\n
Run Code Online (Sandbox Code Playgroud)\n

这是为什么???我是不是错过了什么???谢谢!;)

\n

New*_*Dev 5

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

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

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

p0.send([1,2,3])
p0.send(completion: .finished)
Run Code Online (Sandbox Code Playgroud)

以上将完成整个管道。