さまざまな間隔で値を発行する SignalProducer、ProducerA があります。SignalProducer が発行する最新の N 値を収集し、最新の N 値を含む配列を発行する新しいプロデューサー ProducerB を作成しようとしています。
ProducerB は、ProducerA が最初の N 個の値を発行したときに値の発行を開始し、ProducerA が新しい値を発行するたびに新しい配列を発行する必要があります。
誰かが私を助けることができますか?
さまざまな間隔で値を発行する SignalProducer、ProducerA があります。SignalProducer が発行する最新の N 値を収集し、最新の N 値を含む配列を発行する新しいプロデューサー ProducerB を作成しようとしています。
ProducerB は、ProducerA が最初の N 個の値を発行したときに値の発行を開始し、ProducerA が新しい値を発行するたびに新しい配列を発行する必要があります。
誰かが私を助けることができますか?
私はこのコードを思いついた
extension SignalProducer {
/// Creates a new producer that emits an array that contains the latest N values that were emitted
/// by the original producer as specified in 'capacity'.
@warn_unused_result(message="Did you forget to call `start` on the producer?")
public func latestValues(n:Int) -> SignalProducer<[Value], Error> {
var array: [Value] = []
return self.map {
value in
array.append(value)
if array.count >= n {
array.removeFirst(array.count - n)
}
return array
}
.filter {
$0.count == n
}
}
}
let (producerA, observerA) = SignalProducer<Int, NoError>.buffer(5)
let n = 3
producerA.take(n).collect()
.takeUntilReplacement(producerA.skip(n).map { [$0] })
.scan([], { $0.suffix(n - 1) + $1 })
.startWithNext {
print($0)
}
observerA.sendNext(1) // nothing printed
observerA.sendNext(2) // nothing printed
observerA.sendNext(3) // prints [1, 2, 3]
observerA.sendNext(4) // prints [2, 3, 4]
observerA.sendNext(5) // prints [3, 4, 5]