Это поведение может выглядеть странно, но оно имеет большой смысл. Завершение Future
не завершает PassthroughSubject
. Таким образом, вы можете продолжить отправку значений через PassthroughSubject
, что приведет к созданию и запуску новых экземпляров Future
. Как правило, Publisher
может завершиться только или ошибка один раз. Таким образом, если завершение Future
вызовет закрытие завершения sink
, это означает, что PassthroughSubject
больше не может выдавать новых значений, что нежелательно, поскольку PassthroughSubject
обычно никогда не завершается (если вы не скажете это напрямую).
Как и в вашем примере, этот код также запускает завершение только один раз:
var cancellables = Set<AnyCancellable>()
(0..<2).publisher
.flatMap { _ in return (0..<5).publisher }
.sink(receiveCompletion: { completion in
print("completion received \(completion)")
}, receiveValue: { val in
print("value received \(val)")
})
.store(in: &cancellables)
Причина в том, что созданный издатель публикует sh два значения, а затем завершает , Если издатель flatMap
вызовет завершение sink
, это будет означать, что издатель (0..<2)
завершает работу, за исключением того, что у него все еще есть значения для отправки, поэтому он не завершен.
Короче говоря начинающий издатель решает, когда поток завершится; не раскрученный издатель.