2015-08-25 24 views
6

içine SignalProducers birleştirmek ve ben birkaç SignalProducers onlardan biri bir sinyal üretir zaman bir sinyal üreten bir tek sinyal üreticisi içine bunları birleştirmek istiyorum ReactiveCocoa Ben ReactiveCocoa kullanıyorum biri

let center = NSNotificationCenter.defaultCenter() 
let signalProducer1 = center.rac_notification(name: notificationName1, object: nil) 
let signalProducer2 = center.rac_notification(name: notificationName2, object: nil) 
let signalProducer3 = center.rac_notification(name: notificationName3, object: nil) 

var.

İlk başta combineLatest işlevi iyi bir çözüm gibi görünüyordu

let combinedProducer = combineLatest(signalProducer1, signalProducer2, signalProducer3) 

üç sinyal üretti, ancak this article göre, elde edilen üretici sadece ilk sinyal üretir.

This interactive diagram tam olarak ne istediğimi gösterir, bu yüzden flatten işlevini .Merge FlatteningStrategy ile kullanmak istiyorum. Ancak, bunu başarmak için sözdizimini anlatan zor bir zaman geçiriyorum.

+0

Bkz. Https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/BasicOperators.md#merging –

cevap

9

Sen ulaşabileceği şöyle:

let merged = SignalProducer(values: [ signalProducer1, signalProducer2, signalProducer3 ]) 
    |> flatten(.Merge) 
+0

Bunu ReactiveCocoa 4'de nasıl yaparsınız? – mokagio

14

Güncelleme: RAC 4.2.1 ve yukarı biz derleyici yardımcı bir türleri hakkında daha açıkça belirtilmesi gerekir

nedeniyle changes in how flatten works için:

bunu bölmek isteyebilirsiniz, böylece biraz hantal hale
let s1: SignalProducer<Int, NSError> = ... 
let s2: SignalProducer<Int, NSError> = ... 
let s3: SignalProducer<Int, NSError> = ... 


let _: SignalProducer<Int, NSError> = 
    SignalProducer<SignalProducer<Int, NSError>, NSError>(values: [s1, s2, s3]) 
     .flatten(.Merge) 

:

let producers: SignalProducer<SignalProducer<Int, NSError>, NSError> = 
    SignalProducer(values: [s1, s2, s3]) 

let merged: SignalProducer<Int, NSError> = x.flatten(.Merge) 

Teşekkürler @Harry yeni sürüm sorununu işaret eden açıklama için. RAC 4.2 ve RAC 4'te

altına


bu neden olabilir otomatik tamamlama penceresinde .flatten önermez an Xcode 7.1.1 anda

let merged = SignalProducer(values: [signalProducer1, signalProducer2, signalProducer3]) 
    .flatten(.Merge) 

olurdu Sizde (ya da sadece bana) var olmadığını düşünüyorum, ama eğer hepsini yazarsanız, bu işe yarayacaktır.

+0

Teşekkür ederim, çok yararlı – asdf

+0

Bu artık ReactiveCocoa 4.2.1 ile çalışıyor ve yukarıda – Harry

+0

görünüyor Görünüşe @Harry yorum için. Cevabı güncelliyorum. – mokagio

İlgili konular