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



我有一个连接到ScrollViewPassthroughSubject,它在滚动时发出。我希望主体发出当前的滚动值,但每秒只能发出一次。我试了throttledebounce,但它们似乎没有做我需要的。

像这样,我可以看到每次滚动时它发出,所以我的滚动检测的基本设置工作得很好。
scrollSubject
.sink { value in
print(value)
}
.store(in: &subscription)

但是当我尝试使用这些中的任何一个时:

.throttle(for: 1, scheduler: RunLoop.main, latest: false)(trylatest: truealso) '

.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 { $0 as! Failure }
return combineLatest(timer)
.map(.0)
.eraseToAnyPublisher()
}
}

相关内容

  • 没有找到相关文章

最新更新