Swift Combine - 每秒发出一次最新值

Swift Combine - Emit the latest value once per second

我有一个 PassthroughSubject 连接到 ScrollView 并且它在滚动时发出。我希望主题发出当前滚动值,但每秒只发出一次。我尝试了 throttledebounce,但它们似乎没有满足我的需求。

像这样,我每次滚动时都能看到它发出,所以我的滚动检测基本设置运行良好。

scrollSubject
    .sink { value in
        print(value)
    }
    .store(in: &subscription)

但是当我尝试使用其中任何一个时:

.throttle(for: 1, scheduler: RunLoop.main, latest: false)(也试过 latest: true)`

.debounce(for: 1, scheduler: RunLoop.main)

发生的事情是当我滚动时它们没有发出,只有在我停止后它才会发出最新值。怎么可能达到想要的行为?

您所描述的内容听起来像其他反应式编程库中可用的 sample 运算符。它可以像@Alexander 描述的那样以这种方式实现:

extension Publisher {
  func sample(
    every interval: TimeInterval,
    on runLoop: RunLoop,
    in mode: RunLoop.Mode
  ) -> AnyPublisher<Output, Failure> {
    let timer = Timer.publish(every: interval, on: runLoop, in: mode)
      .autoconnect()
      .mapError { [=10=] as! Failure }

    return combineLatest(timer)
      .map(\.0)
      .eraseToAnyPublisher()
  }
}