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, чтобы узнать, какие сигнальные функции я должен использовать! Благодарю вас!


person hobosf    schedule 24.08.2016    source источник


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

person ajjnix    schedule 26.08.2016