2015-08-25 18 views
6

Ich verwende ReactiveCocoa und ich habe mehrere SignalProducersReactiveCocoa kombinieren SignalProducers in einem

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) 

Ich möchte, dass sie in einem einzigen Signalerzeuger kombinieren, die ein Signal erzeugt, wenn einer von ihnen ein Signal erzeugt.

Zunächst wird die Funktion combineLatest sah wie eine gute Lösung

let combinedProducer = combineLatest(signalProducer1, signalProducer2, signalProducer3) 

jedoch gemäß this article der resultierende Produzent erzeugt nur ihr erstes Signal, wenn alle drei ein Signal erzeugt haben.

This interactive diagram zeigt genau das, was ich will, also möchte ich die flatten Funktion mit der .Merge FlatteningStrategy verwenden. Es fällt mir jedoch schwer, die Syntax dafür herauszufinden.

+0

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

Antwort

9

Sie können das erreichen, wie folgt:

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

Wie würden Sie das in ReactiveCocoa 4 tun? – mokagio

14

Update: RAC 4.2.1 und aufwärts

Aufgrund changes in how flatten works wir den Compiler eine mehr explizit über die Arten helfen müssen:

Das wird ein bisschen umständlich, so dass Sie es vielleicht teilen möchten:

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

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

Dank @Harry für den Kommentar zeigt die neue Version heraus.


RAC 4.2 und unter

In RAC 4 würde dies

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

Im Moment seines Xcode 7.1.1 nicht .flatten im Autokomplettierungsfenster legt nahe, was zur Folge haben könnte in dir (oder nur ich) denke, es ist nicht da, aber wenn Sie alles eingeben, wird es funktionieren.

+0

danke, sehr nützlich – asdf

+0

Dies funktioniert nicht mehr mit ReactiveCocoa 4.2.1 und darüber scheint – Harry

+0

Vielen Dank @Harry für den Kommentar. Ich aktualisiere die Antwort. – mokagio