Sorry, wenn der Titel nicht ganz klar ist, konnte ich mir nichts besseres ...In Rx, wie die neuesten Elemente nach einer bestimmten Zeit gruppiert werden?
ich Benutzereingaben in Form eines IObservable<char>
bin empfangen, und ich möchte es ein zu transformieren IObservable<char[]>
, indem Sie die Zeichen jedes Mal gruppieren, wenn der Benutzer länger als 1 Sekunde aufhört zu tippen. So zum Beispiel, wenn der Eingang wie folgt:
h
e
l
l
o
(pause)
w
o
r
l
d
(pause)
!
(pause)
ich die Ausgabe möge beobachtbar sein:
['h', 'e', 'l', 'l', 'o']
['w', 'o', 'r', 'l', 'd']
['!']
Ich vermute, dass die Lösung ist recht einfach, aber ich kann nicht finden der richtige Ansatz ... Ich habe versucht, Buffer
, GroupByUntil
, Throttle
und ein paar andere, ohne Erfolg zu verwenden.
Jede Idee wäre willkommen!
EDIT: Ich habe etwas, das fast funktioniert:
_input.Buffer(() => _input.Delay(TimeSpan.FromSeconds(1)))
.ObserveOnDispatcher()
.Subscribe(OnCompleteInput);
Aber ich brauche die Verzögerung jedes Mal, wenn ein neues Zeichen zurückgesetzt werden eingegeben wird ...
Danke, es funktioniert super und es ist viel eleganter als meine Lösung. Tatsächlich ist meine Quelle bereits heiß (es ist ein 'Betreff', den ich von Eingabeereignissen füttere); Ich bin mir nicht sicher, was die Auswirkungen der Verwendung von 'Publish(). RefCount()' ist ... –
@ThomasLevesque Wenn Ihre Quelle bereits heiß ist, glaube ich, dass Publish/RefCount nur einige verschwendet Wrapper-Schichten sein wird. Wenn Sie dies als allgemeine Fallfunktion verwenden möchten, würde ich sie wahrscheinlich einfach zurücklassen, es sei denn, sie würden in Ihrer Anwendung ein Problem darstellen.Wenn Sie es nur einmal verwenden, ändern Sie den Parameter in 'hotSource' und hinterlassen Sie eine Notiz in den Dokumentenkommentaren, und Sie sollten Publish/RefCount sicher entfernen können. –