【问题标题】:How to create a Signal or Stream which only output when the input have been stopped for a period of time?如何创建仅在输入停止一段时间后才输出的信号或流?
【发布时间】:2016-03-07 07:54:47
【问题描述】:

如何创建仅在输入停止一段时间后才输出的信号或流?

我想要达到的目标如下:

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

我想将 S1 转换为 S2,它仅在事件停止 3 - 时才输出最后一个事件(其中 - 是 x 秒)。

【问题讨论】:

    标签: functional-programming reactive-programming reactive-cocoa


    【解决方案1】:

    使用方法throttle:,它会等待 x 秒等待另一个信号,然后再通过下一个发送。

    【讨论】:

    • throttle: 不是我想要的。 Throttle 会为 SSSSSSS 产生 S--S--S 但不会产生 --------S。
    • 我确实检查了油门。根据我的测试,当直接针对我的来源时,它会产生第三个值。不过,这可能是时间问题。
    • 对不起,你是对的。 throttle: 是正确的方式,但在ReactiveCocoa 中是有线的。
    【解决方案2】:

    这是 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();
    

    这会在正确的时间产生两个值。

    【讨论】:

      【解决方案3】:

      好的。谷歌搜索后,我找到了我想要的。 http://reactivex.io/documentation/operators/debounce.html

      【讨论】:

      • 去抖动是油门。这就是你对 Lowly 说的你不想要的。
      • 好的。我认为reactive-cocoa 的命名问题,reactive-cocoa 中的油门与debounce 不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      相关资源
      最近更新 更多