Debounce
和 Throttle
是两种常用的操作符,用于控制数据流的频率和处理延迟。但它们的实现方式略有不同。理解这些差异对于在Combine
代码中做出正确选择至关重要。
Debounce
Debounce
操作符用于限制数据流的频率,只有在指定的时间间隔内没有新数据到达时,才会将最后一个数据发送出去。
public func debounce<S>(for dueTime: S.SchedulerTimeType.Stride, scheduler: S, options: S.SchedulerOptions? = nil) -> Publishers.Debounce<Self, S> where S : Scheduler
for
: 这是一个表示时间间隔的参数,指定了在没有新数据到达时等待的时间长度。可以是DispatchTimeInterval
类型,如.seconds(1)表示1秒,.milliseconds(500)表示500毫秒等。scheduler
: 这是一个调度器参数,用于指定在哪个调度器上执行等待和发送操作。通常可以使用DispatchQueue.main
来在主队列上执行操作,也可以用RunLoop.main
,也可以使用其他自定义的调度器。options
: 这是一个可选的参数,用于指定额外的选项。基本不用,直接忽略。
class DebounceViewModel: ObservableObject {
let publisher = PassthroughSubject<String, Never>()
private var cancellable = Set<AnyCancellable>()
@Published var outputArray: [String] = []
init() {
setUpSubscription()
}
func setUpSubscription() {
publisher
.debounce(for: .seconds(0.5), scheduler: RunLoop.main)
.sink {
[weak self] value in
print("Received value: \(value)")
self?.outputArray.append(value)
}
.store(in: &cancellable)
}
func sendMessage(_ text: