shareReplay, ReplayValue & CompletionValue

Multicast que recuerda: un búfer de replay acotado, un último valor al cerrar, y el operador de cadena que envuelve una fuente con ambos.

class ReplayValue<T> { ReplayValue({int? size = 1, Duration? maxAge}); void add(T value); FxEvents<T> get live; // buffer, then live updates Future<void> close(); } class CompletionValue<T> { CompletionValue(); void add(T value); // remembered, emitted on close FxEvents<T> get live; Future<void> close(); } ConnectableEvents<T> FxEvents<T>.connectable() FxEvents<T> ConnectableEvents<T>.refCount() FxEvents<T> FxEvents<T>.shareReplay({int? size, Duration? maxAge, bool resetOnCancel = true})

Lección

share difunde una sola ejecución a muchos oyentes y después olvida. Un oyente que llega después de que un evento haya pasado se lo ha perdido. ReplayValue es el subject que recuerda: add añade a un búfer recortado por size (por defecto 1; null es ilimitado) y maxAge, y cada suscriptor tardío reproduce primero el búfer retenido, y después se sube a las actualizaciones en vivo. Los errores no se retienen. Tras close, un oyente tardío sigue recibiendo el búfer, y luego el cierre. Capa de eventos de fxdart, siguiendo al ReplaySubject de Rx.

CompletionValue es la otra memoria: add solo recuerda, y el último valor se emite al cerrar — nada mientras está abierto, luego ese valor y el cierre. Un oyente tardío tras el cierre recibe lo mismo. Un addError completa de inmediato con el error, no con un valor recordado. El AsyncSubject de Rx. LiveValue, a continuación, es el subject de valor actual con una lectura síncrona .value — un ReplayValue de tamaño 1 sin el getter.

connectable() es la forma manual: devuelve un ConnectableEvents cuyo feed events no suscribe la fuente hasta connect(). Los oyentes enganchados de antemano esperan; los oyentes tardíos se pierden los valores ya emitidos. refCount() conecta con el primer oyente y desconecta con el último, reconectando cuando la fuente permite un segundo listen. shareReplay es la forma habitual: multicast a través de un ReplayValue, conexión en el primer oyente, oyentes tardíos ven el historial. resetOnCancel (por defecto true) arranca un búfer fresco cuando el último oyente se va; false deja la fuente conectada para siempre.

Capa de eventos de fxdart, siguiendo a ReplaySubject, AsyncSubject, ConnectableObservable y shareReplay de Rx.

Demo 1 · Un suscriptor tardío ve el búfer

Demo 2 · CompletionValue emite al cerrar

Pruébalo tú

Ejercicio: shareReplay sobre un fromIterable, dos oyentes.

Relacionado: share — multicast sin memoria; los oyentes tardíos se pierden lo que ya pasó · LiveValue — el subject de valor actual, con un .value síncrono · fxEvents — el .live de estos subjects es esa cadena