2015-08-25 7 views
6

में SignalProducers गठबंधन और मैं कई SignalProducersReactiveCocoa मैं ReactiveCocoa उपयोग कर रहा हूँ एक

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) 

मैं उन्हें एक ही संकेत निर्माता है कि एक संकेत है जब भी उनमें से एक एक सिग्नल पैदा का उत्पादन में गठबंधन करना चाहते हैं।

सबसे पहले combineLatest समारोह एक अच्छा समाधान की तरह दिखाई देता

let combinedProducer = combineLatest(signalProducer1, signalProducer2, signalProducer3) 

हालांकि, this article के अनुसार, जिसके परिणामस्वरूप निर्माता केवल अपनी पहली सिग्नल पैदा जब सभी तीन एक संकेत का उत्पादन किया है।

This interactive diagram बिल्कुल वही दिखाता है जो मैं चाहता हूं, इसलिए मैं फ़ंक्शन .Merge FlatteningStrategy के साथ उपयोग करना चाहता हूं। हालांकि, मुझे यह प्राप्त करने के लिए वाक्यविन्यास को समझने में कठिनाई हो रही है।

+0

देखें https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/BasicOperators.md#merging –

उत्तर

9

आप प्राप्त कर सकते हैं कि इस प्रकार है:

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

आप इसे ReactiveCocoa 4 में कैसे करेंगे? – mokagio

14

अद्यतन: आरएसी 4.2.1 और ऊपर की तरफ

कारण changes in how flatten works को हम संकलक मदद एक प्रकार के बारे में अधिक स्पष्ट करने की आवश्यकता है:

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) 

धन्यवाद @ नए संस्करण के मुद्दे को इंगित करने वाली टिप्पणी के लिए हैरी।


आरएसी 4.2 और

आरएसी 4 में नीचे इस

let merged = SignalProducer(values: [signalProducer1, signalProducer2, signalProducer3]) 
    .flatten(.Merge) 
पल Xcode 7.1.1 स्वतः पूर्ण विंडो में .flatten मतलब यह नहीं है पर

, परिणाम हो सकता है हो सकता है आप में (या सिर्फ मुझे) सोच रहा है कि यह वहां नहीं है, लेकिन यदि आप इसे टाइप करते हैं तो यह काम करेगा।

+0

धन्यवाद, बहुत उपयोगी – asdf

+0

यह अब ReactiveCocoa 4.2.1 के साथ काम नहीं करता है और इसके बाद यह – Harry

+0

धन्यवाद @ टिप्पणी के लिए हैरी। मैं जवाब अद्यतन करता हूँ। – mokagio

संबंधित मुद्दे