iOS Combine отменяет огонь вручную

#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