2015-08-25 7 views
6

sto usando ReactiveCocoa e ho diversi SignalProducersReactiveCocoa combinare in un unico SignalProducers

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) 

voglio combinarle in un unico produttore segnale che produce un segnale ogni volta che uno di essi produce un segnale.

Dapprima la funzione combineLatest sembrava una buona soluzione

let combinedProducer = combineLatest(signalProducer1, signalProducer2, signalProducer3) 

Tuttavia, secondo this article, il produttore risultante produce solo il primo segnale quando tutti e tre hanno prodotto un segnale.

This interactive diagram mostra esattamente ciò che desidero, quindi voglio utilizzare la funzione flatten con lo .Merge FlatteningStrategy. Tuttavia, sto avendo difficoltà a capire la sintassi per raggiungere questo obiettivo.

+0

Vedere https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/BasicOperators.md#merging –

risposta

9

È possibile raggiungere questo obiettivo nel modo seguente:

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

Come procedere in ReactiveCocoa 4? – mokagio

14

Aggiornamento: RAC 4.2.1 e verso l'alto

causa changes in how flatten works dobbiamo aiutare il compilatore di essere più esplicito sui tipi:

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) 

Diventa un po 'macchinoso, quindi potresti dividerlo:

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

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

Grazie a @Harry per il commento che indica il problema della nuova versione.


RAC 4.2 e sotto

In RAC 4 sarebbe

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

Al momento Xcode 7.1.1 non suggerisce .flatten nella finestra completamento automatico, che potrebbe causare in te (o solo io) pensando che non ci sia, ma se lo digiti tutto funzionerà.

+0

grazie, molto utile – asdf

+0

Questo non funziona più con ReactiveCocoa 4.2.1 e sopra sembra – Harry

+0

Grazie a @Harry per il commento. Aggiorno la risposta – mokagio

Problemi correlati