2016-08-24 18 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)") 
     } 

はまた、あなたはSignalProducerとしてごexecuteSearchを書いて、flatMap(.Latest)を使用するための信号チェーンを作成することができます。

また、mainQueueShedulerを使用してUIに結果を取得するのを忘れないでください