Как реализовать одноразовое использование заказанного ReplaySubject?

Как я могу иметь одного подписчика ReplaySubject тот:

  1. буферизует все события, полученные с onNext() пока кто-то не подпишется на него,
  2. как только кто-то подписывается на него, все буферизованные события пересылаются подписчику, стирая их из ReplaySubject буфер (по соображениям производительности) и последующие события пересылаются только подписчику (больше нет буферизации),
  3. если на него подписывается более одного наблюдателя, выдается исключение,
  4. все буферизованные события, передаваемые субъекту, упорядочены на основе времени, когда было сгенерировано каждое событие, и они пересылаются подписчику в этом порядке во время подписки?

Кроме того, имеет ли это смысл? Я думаю, что были бы хорошие случаи использования для этого предмета, для случаев, когда это передает события от, например, файловой системы...

1 ответ

Решение

Здесь UnicastSubject для этой цели, хотя это не является частью официального API; это означает, что это может измениться или быть удаленным без предупреждения.

редактировать

Позвольте мне указать вам функции, которые вы просили:

1) буферизует все события:

Если нет дочернего элемента или он не догнал: сохраните элемент в очереди:

2) При подписке, буфер используется и воспроизводится подписчику

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

3) если на него подписывается более одного наблюдателя, выдается исключение

Последующий подписчик получит исключение

4) все буферизованные события, данные субъекту, упорядочены по времени, когда каждое событие было сгенерировано.

Использует однопользовательскую очередь одного производителя, которая гарантирует порядок FIFO

Другие вопросы по тегам