Niestety, gdy tytuł nie jest bardzo jasne, nie mogłam myśleć o niczym lepszym ...W języku Rx, jak grupować najnowsze elementy po pewnym czasie?
ja odbierający dane wprowadzone przez użytkownika w postaci IObservable<char>
, i chciałbym, aby przekształcić go do IObservable<char[]>
, grupując znaki za każdym razem, gdy użytkownik przestaje pisać przez ponad 1 sekundę. Tak więc, na przykład, jeśli wejście jest w następujący sposób:
h
e
l
l
o
(pause)
w
o
r
l
d
(pause)
!
(pause)
Chciałbym wyjście zaobserwowania być:
['h', 'e', 'l', 'l', 'o']
['w', 'o', 'r', 'l', 'd']
['!']
Podejrzewam, że rozwiązanie jest dość proste, ale nie mogę znaleźć właściwe podejście ... Próbowałem użyć Buffer
, GroupByUntil
, Throttle
i kilku innych, bezskutecznie.
Każdy pomysł byłby mile widziany!
EDIT: Mam coś, co prawie działa:
_input.Buffer(() => _input.Delay(TimeSpan.FromSeconds(1)))
.ObserveOnDispatcher()
.Subscribe(OnCompleteInput);
Ale muszę opóźnienie należy zresetować za każdym razem nowy znak jest wpisany ...
Dzięki, działa świetnie i jest znacznie bardziej elegancko niż moje rozwiązanie. Właściwie to moje źródło jest już gorące (jest to "Temat", który zasilam ze zdarzeń wejściowych); Nie jestem pewien jaki wpływ na użycie 'Publish(). RefCount()' jest ... –
@ThomasLevesque Jeśli twoje źródło jest już gorąca, wierzę, że Publish/RefCount będzie po prostu zmarnowanymi warstwami otoki. Jeśli chcesz użyć tego jako funkcji ogólnego przypadku, prawdopodobnie po prostu zostawiłbym je, chyba że są one wyświetlane jako problem w twojej aplikacji.Jeśli użyjesz go tylko raz, zmień parametr na 'hotSource' i zostaw notatkę w komentarzach do dokumentu i powinieneś bezpiecznie usunąć Publish/RefCount. –