Lo siento si el título no está muy claro, no podía pensar en nada mejor ...En Rx, ¿cómo agrupar los últimos artículos después de un período de tiempo?
que estoy recibiendo la entrada del usuario en forma de un IObservable<char>
, y me gustaría transformarlo a una IObservable<char[]>
, agrupando los caracteres cada vez que el usuario deja de escribir durante más de 1 segundo. Así, por ejemplo, si la entrada es la siguiente:
h
e
l
l
o
(pause)
w
o
r
l
d
(pause)
!
(pause)
me gustaría la salida observable a ser:
['h', 'e', 'l', 'l', 'o']
['w', 'o', 'r', 'l', 'd']
['!']
Sospecho que la solución es bastante simple, pero no puedo encontrar el enfoque correcto ... Traté de usar Buffer
, GroupByUntil
, Throttle
y algunos otros, fue en vano.
¡Cualquier idea sería bienvenida!
EDIT: Tengo algo que casi funciona:
_input.Buffer(() => _input.Delay(TimeSpan.FromSeconds(1)))
.ObserveOnDispatcher()
.Subscribe(OnCompleteInput);
pero necesito el retraso que se restablece cada vez que se escribe un nuevo personaje ...
Gracias, funciona muy bien y es mucho más elegante que mi solución. En realidad, mi fuente ya está caliente (es un 'Asunto' que alimentar desde eventos de entrada); No estoy seguro de cuál es el impacto del uso de 'Publish(). RefCount()' es ... –
@ThomasLevesque Si su fuente ya está activa, creo que Publish/RefCount serán algunas capas de contenedor desperdiciadas. Si desea utilizar esto como una función de caso general, probablemente simplemente los deje a menos que se demuestre que son un problema en su aplicación.Si lo usa solo por esta vez, cambie el parámetro a 'hotSource' y deje una nota en los comentarios del documento y debe poder quitar Publish/RefCount. –