IConnectableObservables в Rx - PullRequest
       15

IConnectableObservables в Rx

38 голосов
/ 14 мая 2010

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

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

1 Ответ

61 голосов
/ 20 мая 2010

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

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

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

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

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

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

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

...