Подтвердить что ты не робот

IConnectableObservables в Rx

Может кто-нибудь объяснить различия между Observable и ConnectableObservable? Документация Rx Extensions очень скудная, и я не понимаю, в каких случаях ConnectableObservable полезен.

Этот класс используется в методах Replay/Prune.

4b9b3361

Ответ 1

Короткий ответ:

IConnectableObservable представляет ожидающий горячий наблюдаемый, который может использоваться несколькими подписчиками. Вызов IConnectableObservable.Connect() приводит к тому, что изменение становится горячим (подписывается на наблюдаемый холодный источник)

Длинный ответ:

Холодный наблюдаемый (например, Observable.Range) повторяет последовательность для каждого абонента. Он аналогичен секундомеру, где каждому абоненту предоставляется свой секундомер. Абонент запускает секундомер, подписываясь, и секундомер останавливается (и сбрасывается), как только наблюдатель прекращает наблюдение.

Горячая наблюдаемая разделяет последовательность между всеми подписчиками. Это аналог того, что есть один секундомер, и всем подписчикам дается одно и то же отсчет времени, независимо от того, когда они начали смотреть.

IObservable.Publish преобразует холодный наблюдаемый в горячий наблюдаемый, но возвращает IConnectableObservable. Это позволяет подписчикам подписываться на (один) секундомер перед его запуском. Вызов IConnectableObservable.Connect() запускает секундомер. Утилизация возвращаемого значения Connect() останавливает секундомер.

Стоит отметить, что некоторые наблюдаемые источники горячие по своей природе. Например, события мыши могут срабатывать независимо от того, подписаны ли они на них. Все подключаемые наблюдаемые в этом сценарии будут иметь общую подписку на событие.