Swift Combine - 每秒发出一次最新值
Swift Combine - Emit the latest value once per second
我有一个 PassthroughSubject
连接到 ScrollView
并且它在滚动时发出。我希望主题发出当前滚动值,但每秒只发出一次。我尝试了 throttle
和 debounce
,但它们似乎没有满足我的需求。
像这样,我每次滚动时都能看到它发出,所以我的滚动检测基本设置运行良好。
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()
}
}
我有一个 PassthroughSubject
连接到 ScrollView
并且它在滚动时发出。我希望主题发出当前滚动值,但每秒只发出一次。我尝试了 throttle
和 debounce
,但它们似乎没有满足我的需求。
像这样,我每次滚动时都能看到它发出,所以我的滚动检测基本设置运行良好。
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()
}
}