1.前言
接着讲解剩下的那一半操作符。这些操作符相对而言比较高级,大部分都不太常用,但在某些情况下可以明显减少代码逻辑,提高工作效率,还是有必要了解的。
2.实用辅助操作符
辅助被观察者的操作符的集合。
Subscribe — 对被观察者的事件和通知进行操作。
subscribe()操作符像胶水一样连接着观察者和被观察者。为了使观察者捕获被观察者产生的事件或onError()、onCompleted()通知,必须用这个操作符先订阅那个被观察者。它的典型实现可能要接受一到三个方法(然后构成观察者),或者接受一个实现包含那三个方法的接口的对象(有时称为观察者或订阅者):
onNext()每当被观察者产生一个事件,它将调用这个方法,并使用它产生的事件作为参数。
onError()被观察者调用这个方法,表明它未能生成预期的数据,或者遇到一些其它的错误,将不会接着调用onNext()或onCompleted()方法。onError()方法使用导致错误的指示(取决于自己的实现,有时是个对象,像Exception或Throwable;有时是简单字符串),作为它的参数。
onCompleted()被观察者调用onNext()方法之后,且没有遇到任何问题,当结束事件的产生时,它调用这个方法。
若被观察者是冷类型,它将不会开始产生事件直到一个观察者订阅了它;若被观察者是热类型,它可能在任何时间开始产生事件,而订阅者可能从某时刻开始捕获事件队列,并丢失之前的所有事件。
当被观察者发生某些事件时,ReactiveX将会调用注册的回调方法。并且这些回调方法,将会因为被观察者相关的一般通知事件独立地调用。不同的ReactiveX实现中,已经设计了相关的各种操作符。
Materialize / Dematerialize — 将一般事件和通知事件当成一般事件传递,或反转此过程。

一个格式良好且有限的被观察者将调用自己观察者的onNext()方法零到多次,接着将调用onCompleted()或onError()方法至少一次。materialize()操作符会将这一系列调用(不管一般的onNext()通知还是终止的onCompleted()或onError()通知)都转换成一般事件。
dematerialize()操作符反转上面的过程。作用于一个之前被materialize()操作符转换过的被观察者,使它返回原来的样子。
- ObserveOn — 指定观察者所在的线程来订阅被观察者。
- ReactiveX的许多实现使用Schedulers来管理被观察者在多线程环境下线程的切换。通过observeOn()操作符,告诉被观察者发送自己的通知给指定线程下的观察者。
- 注意,observeOn()操作符会直接传递接收到的一个onError()终止通知,而不会等待观察者缓慢地接收任何尚未传递到的已知事件。这可能意味着,如上图所示,onError()通知跳到部分原始事件之前。
subscribeOn()操作符与之类似,是告诉被观察者,它的操作所在的指定线程,以及在此线程上通知自己的观察者。默认情况下,被观察者、使用的操作链和将通知的观察者都执行在subscribe()方法调用的线程上。subscribeOn()操作符通过调度被观察者应该执行的指定线程,来改变这个行为。observeOn()操作符则指定不同的线程,让被观察者发送通知给自己的观察者。
如上图所示,subscribeOn()操作符指定被观察者将开始执行于哪个线程,且可以被调用于操作链的任意位置。observeOn()操作符则相反,影响被观察者接下来使用的操作符出现的线程。为此,在被观察者操作链期间的不同位置,可能多次调用observeOn()操作符来改变后面操作符执行的线程。
SubscribeOn — 指定被观察者执行时所在的线程。
ReactiveX的许多实现使用Schedulers来管理被观察者在多线程环境下线程的切换。通过调用被观察者的subscribeOn()操作符,告诉它自己在指定线程下执行。observeOn()操作符与之类似,但有更多限制,它告诉被观察者发送自己的通知给指定线程下的观察者。在一些实现中,也有unsubscribeOn()操作符。
Serialize — 迫使被观察者进行同步连续的调用,使行为良好。

当来自不同线程时,同一个被观察者异步调用自己观察者的方法也是有可能。这样可能导致被观察者违反之前的约定,因为它可能在onNext()通知之前,试着发送一个onCompleted()或onError()通知;或者可能从两个不同的线程同时发送onNext()通知。可以通过使用serialize()操作符,迫使这个被观察者有良好行为和同步。
Delay — 将被观察者的事件向后推迟指定的时间。
delay()操作符通过在产生原始事件之前,停顿一个特定时间(人为指定),来修改自己原始被观察者。将导致被观察者产生的整个事件队列,推迟一个指定的时间。
TimeInterval — 将一个产生事件的被观察者转换成以原始事件的时间间隔的标识为事件的被观察者。
timeInterval()操作符拦截原始事件,且将相邻事件之间的时间间隔的标识作为事件来替换。
Timestamp — 给被观察者产生的每个事件附加一个时间戳来表明它什么时候产生的。
登录 | 立即注册