为什么 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)
以上将完成整个流水线。
我们知道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)
以上将完成整个流水线。