Как создать сигнал или поток, который выводится только тогда, когда ввод был остановлен в течение определенного периода времени?

Как создать сигнал или поток, который выводится только тогда, когда ввод был остановлен в течение определенного периода времени?

Я хочу добиться следующего:

S1 : S - - S S S S - - - - - S S S S - - - -
S2 : - - - - - - - - - S - - - - - - - - S -

Я хотел бы преобразовать S1 в S2, который выводит последнее событие только в том случае, если событие остановилось на 3 - (где - x секунд).


person Morty Choi    schedule 07.03.2016    source источник


Ответы (3)


Используйте метод throttle:, который ожидает x секунд другого сигнала перед отправкой следующего.

person Charles Maria    schedule 07.03.2016
comment
throttle: это не то, что я хочу. Дроссель будет производить S--S--S для SSSSSSS, но не --------S. - person Morty Choi; 07.03.2016
comment
Я проверил дроссельную заслонку. Из моего тестирования он выдает третье значение, если сравнивать его непосредственно с моим источником. Хотя, возможно, это проблема времени. - person Enigmativity; 07.03.2016
comment
Извините, вы правы. throttle: правильный путь, но в ReactiveCocoa зашит. - person Morty Choi; 07.03.2016

Это код C#, но вы должны быть в состоянии перевести:

string xs = "S--SSSS-----SSSS----";
IObservable<char> source =
    Observable
        .Interval(TimeSpan.FromSeconds(1.0))
        .Zip(xs.ToCharArray(), (n, c) => c)
        .Where(c => c == 'S');

IObservable<char> query =
    source
        .Select(x =>
            Observable
                .Timer(TimeSpan.FromSeconds(3.0))
                .Select(y => x))
        .Switch();

Это дает два значения в нужное время.

person Enigmativity    schedule 07.03.2016

Ok. Погуглив, я нашел то, что мне нужно. http://reactivex.io/documentation/operators/debounce.html

person Morty Choi    schedule 07.03.2016
comment
Дебаунс - это дроссель. Это то, что ты сказал Лоули, что не хочешь. - person Enigmativity; 07.03.2016
comment
ХОРОШО. Я думаю, что проблема с именованием с reactive-cocoa, дроссель в reactive-cocoa не похож на debounce. - person Morty Choi; 07.03.2016