0

たとえば、しきい値を下回ったときに補充する必要があるキューなど、非常に頻繁に変化するプロパティを監視しているとしましょう。

queue.rac_valuesForKeyPath("count", observer: self)
  .toSignalProducer()
  .filter({ (queueCount: AnyObject?) -> Bool in
     let newQueueCount = queueCount as! Int
     return newQueueCount < 10
  })
  .on(next: { _ in
     // Refilling the queue asynchronously and takes 10 seconds
     self.refillQueue(withItemCount: 20)
  })
  .start()

キューが空になると、次のハンドラーがトリガーされ、キューがいっぱいになります。count プロパティが 1 に変更されたため、キューがいっぱいになると、SignalProducer は新しい次のイベントを送信します。しかし、次のハンドラーをトリガーしたくありません。代わりに、キューがそのしきい値を下回るたびに 1 回トリガーしたいと思います。

どうすればこれを最善の方法で行うことができますか? 役立つイベント ストリーム操作はありますか? 何か案は?

乾杯、

ジェラルド

4

1 に答える 1

0

combinePrevios現在と以前の値が得られるため、ここで演算子を使用できると思います。

queue.rac_valuesForKeyPath("count", observer: self)
  .toSignalProducer()
  .combinePrevious(0)
  .filter { (previous, current) -> Bool in
    return previous >= 10 && current < 10
  }
  .on(next: { _ in
     // Refilling the queue asynchronously and takes 10 seconds
     self.refillQueue(withItemCount: 20)
  })
  .start()

別のアプローチは、元のコードにskipRepeats()afterを追加することですが、この特定のケースではより明示的filterだと思います。combinePrevious

于 2016-02-14T16:29:34.077 に答える