2016-01-07 4 views
1

У меня есть SignalProducer, ProducerA, который испускает значения в разные интервалы времени. Я пытаюсь собрать последние значения N, которые SignalProducer испускает и создает новый производитель ProducerB, который испускает массив, содержащий последние значения N.ReactiveCocoa - SignalProducer, который испускает последние значения N в массиве

Производитель B должен начать излучать значения, когда ProducerA испускает первые значения N, а затем излучает новый массив каждый раз, когда ProducerA испускает новое значение.

Может кто-нибудь мне помочь?

ответ

0

Я придумал этот код

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 
     } 
    } 
} 
0
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] 
+0

, который не является желаемым результатом. В вашем коде вы указываете n = 3, что означает, что массив должен иметь размер 3. Принятый результат будет для n = 3: observerA.sendNext (1) // ничего не напечатано observerA.sendNext (2) // ничего не напечатано observerA.sendNext (3) // печатает [1, 2, 3] observerA.sendNext (4) // печатает [2, 3, 4] observerA.sendNext (5) // печатает [3, 4 , 5] – gkaimakas

+0

@ gkaimakas: Я редактировал свой код. –