我有一个连接到ScrollView
的PassthroughSubject
,它在滚动时发出。我希望主体发出当前的滚动值,但每秒只能发出一次。我试了throttle
和debounce
,但它们似乎没有做我需要的。
scrollSubject
.sink { value in
print(value)
}
.store(in: &subscription)
但是当我尝试使用这些中的任何一个时:
.throttle(for: 1, scheduler: RunLoop.main, latest: false)
(trylatest: true
also) '
.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()
}
}