publish 运算符将您的 Observable 转换为 Connectable Observable。
让我们看看Connectable Observable 是什么意思:假设您想要多次订阅 observable 并且想要为每个订阅者提供相同的项目。您需要使用Connectable Observable。
示例:
var period = TimeSpan.FromSeconds(1);
var observable = Observable.Interval(period).Publish();
observable.Connect();
observable.Subscribe(i => Console.WriteLine("first subscription : {0}", i));
Thread.Sleep(period);
observable.Subscribe(i => Console.WriteLine("second subscription : {0}", i));
输出:
first subscription : 0
first subscription : 1
second subscription : 1
first subscription : 2
second subscription : 2
在这种情况下,我们可以在第一个项目发布之前快速订阅,但仅限于第一个订阅。第二次订阅晚了,错过了第一次发布。
我们可以移动 Connect() 方法的调用,直到完成所有订阅。这样,即使调用了 Thread.Sleep,我们也不会真正订阅底层证券,直到两个订阅都完成之后。这将按如下方式完成:
var period = TimeSpan.FromSeconds(1);
var observable = Observable.Interval(period).Publish();
observable.Subscribe(i => Console.WriteLine("first subscription : {0}", i));
Thread.Sleep(period);
observable.Subscribe(i => Console.WriteLine("second subscription : {0}", i));
observable.Connect();
输出:
first subscription : 0
second subscription : 0
first subscription : 1
second subscription : 1
first subscription : 2
second subscription : 2
所以使用 Completable Observable,我们可以控制何时让 Observable 发射项目。
示例来自:http://www.introtorx.com/Content/v1.0.10621.0/14_HotAndColdObservables.html#PublishAndConnect
编辑
根据this link中的第180张幻灯片:
发布的另一个性质是,如果任何观察者在 10 秒后开始观察 observable 开始发射项目,则观察者只会获得 10 秒后(订阅时)发出的项目,而不是所有项目。所以在侧面,我可以理解发布正在用于 UI 事件。任何观察者都应该只接收在它订阅之后执行的那些事件,而不是之前发生的所有事件,这是完全有道理的。
希望对你有帮助。