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 для получения результата в пользовательском интерфейсе

Другие вопросы по тегам