Быстрое объединение makeConnectable с PassthroughSubject - PullRequest
0 голосов
/ 14 марта 2020

Мне трудно использовать протокол Connectable на PassthroughSubject. То, что я хотел бы сделать, это иметь возможность контролировать, когда PassthroughSubject начинает отправлять события своим подписчикам.

let eventPublisher = PassthroughSubject<String, Never>().makeConnectable()
let subscriber = MySubscriber()
eventPublisher.subscribe(subscriber)

eventPublisher.send("Hello") // Does not compile, send not found in Publisher.MakeConnectable

let cancelable = eventPublisher.connect()
// expect MySubscriber to recieve "Hello"

Я новичок в Объединении, но я не понимаю, как я могу отправлять значения после подписки становится подключаемым издателем и звонит connect(). Документы по этой теме довольно редки, и я надеюсь, что кто-то может показать мне, как добиться этого поведения.

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Вы близки, но не понимаете, что позволяет makeConnectable . Он не «ставит в очередь» данные и не подготавливает их к отправке, когда они доступны, он контролирует, когда подписка установлена.

Как только подписка разрешена (с .connect()), издатель « в прямом эфире ", и подписчик получит отправленное вами значение. Однако все, что вы отправляете до вызова connect(), по существу отбрасывается, а не ставится в очередь.

При этом, если вы вызываете eventPublisher.send('after connect') после последней строки, это будет получено подписчиком.

0 голосов
/ 17 марта 2020

Звучит так, как будто вы хотите CurrentValueSubject, а не PassthroughSubject.

let countPublisher = CurrentValueSubject<Int,Never>(0)

var storage = Set<AnyCancellable>()

func f() {
    self.countPublisher.value = 1
    self.countPublisher
        .sink {print($0)} // 1
        .store(in:&self.storage)
}

Как вы можете видеть, мы можем заправить насос сохраненным значением до того, как придет какой-либо абонент, а когда абонент придет, он сразу же получит сохраненное значение. И после этого мы можем сказать .send, и подписчики получат все, что мы отправим.

...