2016-08-24 50 views
1

我正在使用ReactiveCocoa 4实现搜索文本字段,并且希望在没有文本输入X次的时间后才能点击搜索API。我之前通过取消先前的计划并在textDidChange委托方法中引发了一个“executeSearch”选择器来完成此操作。这可以确保每次输入时,任何先前预定的“executeSearch”选择器都将被取消,并且新的计划将在X秒内触发。ReactiveCocoa 4 - 延迟和过滤信号事件

我现在想要做同样的行为,但是从一个信号生产者绑定到我的输入文本。我目前的实施很接近,但不一样。此行为仅将文本输入事件限制为每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获取结果到UI