2016-05-11 24 views
2

怎样才可以有一个单用户ReplaySubject认为:如何实现单次使用订购的ReplaySubject?

  1. 缓冲区与onNext()收到的所有事件,直到有人订阅它,
  2. 一旦有人订阅它,所有缓存事件转发到用户,擦除他们从ReplaySubject缓冲液(出于性能原因)和随后的事件仅转发到用户(没有更多的缓冲),
  3. 如果多于一个观察者预订它,则抛出异常,
  4. 所有缓冲的EV根据每个事件生成的时间排序,并在订阅期间按订单的顺序将订单转发给订户?

此外,这是否有意义?我认为这个主题会有很好的用例,例如当它从文件系统转发事件时...

回答

3

为此目的,有UnicastSubject,虽然它不是官方API的一部分;这意味着它可以在没有警告的情况下更改或删除。

编辑

让我点你,你所要求的功能:

1)缓冲的所有事件:

If there is no child or it hasn't caught up: store the element in the queue

2)当认购,缓冲区消费并重播给订户

The drain loop will poll from the queue and consume itif the Subscriber caught up, will emit to it directly

3)如果多于一个观察者预订它,则抛出异常

A subsequent subscriber will get an exception

4)给予所述受试者的所有缓冲的事件排序基于当被生成的每个事件的时间

Uses a single-producer single-consumer queue that guarantees FIFO order

+0

在我提到的4个项目中,UnicastSubject只满足第3项(在超过1个用户的情况下为例外)......也许会有一个简单的方法来实现这样一个主题tch,所有4件物品都满足了? –

+0

你是什么意思?看看这一行:https://github.com/ReactiveX/RxJava/blob/1.x/src/main/java/rx/internal/operators/UnicastSubject.java#L256 – akarnokd

+0

准确地说...这是项目编号3,我建议的4 ...单播主题不*执行1,2或4,所以它不回答这个问题... –