ReactiveCocoa 4 - задержка и фильтрация событий сигнала
Я реализую текстовое поле поиска с использованием ReactiveCocoa 4 и хочу использовать API поиска только после того, как текст не был введен в течение X времени. Я сделал это ранее, отменив ранее запланированное и запустив селектор executeSearch в методе делегата textDidChange. Это гарантирует, что каждый раз, когда я печатаю, любой ранее запланированный селектор executeSearch отменяется, а новый запускается через X секунд.
Теперь я хочу сделать то же самое поведение, но от производителя сигнала, привязанного к моему входному тексту. Моя текущая реализация близка, но не такая же. Такое поведение просто регулирует событие ввода текста, чтобы срабатывать только каждые 0,5 секунды, вместо отмены предыдущего события.
searchTextInput.producer.delay(0.3, onScheduler: RACScheduler.currentScheduler())
.throttle(0.5, onScheduler: RACScheduler.currentScheduler())
.producer.startWithNext({ [unowned self] searchText in
self.executeSearch(searchText)
})
Я с трудом просматриваю документацию ReactiveCocoa 4, чтобы узнать, какие функции сигналов мне следует использовать! Спасибо!
1 ответ
Вам нужно использовать DateSchedulerType. Например:
textField.rac_textSignal()
.toSignalProducer()
.map { $0 as! String }
.flatMapError { _ in SignalProducer<String, NoError>.empty }
.throttle(2.0, onScheduler: QueueScheduler.mainQueueScheduler)
.filter { $0.isEmpty }
.startWithNext { text in
print("t: \(text)")
}
Также вы можете написать свой executeSearch как SignalProducer и использовать flatMap(.Latest) для создания цепочек сигналов.
И не забудьте использовать mainQueueSheduler для получения результата в пользовательском интерфейсе