【问题标题】:How does the Throttle publisher work in Swift Combine?Throttle 发布者如何在 Swift Combine 中工作?
【发布时间】:2020-11-06 18:53:03
【问题描述】:

我被Throttle 出版商困住了。我不明白它选择间隔的方式。 Debounce publisher 更容易理解,它在每个发布的值之后选择一个间隔,并检查在该间隔期间是否发布了新值。我见过一些Throttle 甚至from Apple 的例子,但它们非常非常简单。

假设我们有一些上游产生值,并且我们知道所有值的产生时间 (input: [Time])。 Throttle 发布者使用这些值,限制它们并在其他时间产生值 (output: [Time])。有没有办法编写一个函数来产生正确的预期output

func output<Time>(interval: Time, input: [Time]) -> [Time] {
  //
}

顺便说一句,我相信latest 参数在选择区间时没有任何作用,是吗?我相信它只是从提供的间隔中选择值。

【问题讨论】:

标签: swift throttling combine frp debounce


【解决方案1】:

油门可能是一个难以理解的野兽。参数latest 确实会有所不同,具体取决于接收到的未来值的时间 - 它控制在节流超时期间接收到的那些值中的哪些(第一个或最后一个)在过期时传播。

在收到至少一个值之前,Throttle 不会真正开始“参与”延迟或取消进一步的值。一旦发生这种情况,您可以将其视为“启动计时器”。让我们使用一个持续时间为 1 秒的示例节流阀。启动油门接合的第一个值总是通过。之后的值受油门影响。

当油门开始接合时,只有在 1 秒的持续时间结束后才会传播更多值。如果您在该“超时”窗口期间传播了多个值,则参数“最新”选择在节流计时器到期时将这些属性中的哪些属性存储并沿发布链传播,并为下一系列值重置。 latest 为真意味着给我在油门计时器到期之前传播的最后一个值。

https://heckj.github.io/swiftui-notes/#reference-throttle 上的时间线图表对此有点意义,尽管在实践中我自己并没有发现自己非常需要在最新与否之间进行选择,尽管我怀疑有些用例很关键。

如果您正在寻找只是“减慢”流量但保留所有值的东西,这不是您想要的 - 它会降低值以启用油门。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多