#ios #swift #combine #debouncing
Вопрос:
Я использую оператор debounce платформы iOS Combine.
var subject = PassthroughSubject<Void, Never>()
var cancellable: Cancellable!
cancellable = subject
.debounce(for: .seconds(0.1), scheduler: RunLoop.main)
.sink {
// doSomething
}
Теперь я хочу «запустить событие», чтобы что-то сделать до окончания таймера (0,1 секунды).
Есть ли метод, который может вызвать это?
Ответ №1:
Самым простым способом было бы использовать handleEvents
методы для управления любым событием через конвейер. Хотя и не единственная, и более крутая.
Вы можете использовать две подписки, чтобы разделить свою логику. Кроме того, в первом случае, когда вы не хотите иметь задержку, вы можете использовать только первое значение с first()
или prefix(1)
.
Я делюсь с вами примером:
import Foundation
import Combine
let subject = PassthroughSubject<Void, Never>()
// The shared one is optional, depending on the case.
For heavy publishers which for example do network requests is a good practice.
let sharedSubject = subject.share()
let normalCancellable = sharedSubject.first()
.sink { print("Normal") }
let debouncedCancellable = sharedSubject
.debounce(for: .seconds(0.3), scheduler: RunLoop.main)
.sink { print("Debounced") }
subject.send()
subject.send()
subject.send()
Выход
receive subscription: (PassthroughSubject)
request unlimited
receive value: (())
Normal
receive value: (())
receive value: (())
Debounced