2015-09-25 39 views
2

比方說,我有一個返回SignalProducer<AnyObject?, NSError>的函數,我想將生產者綁定到多個MutableProperty<String>。所以,這樣的事情:在ReactiveCocoa 3和ReactiveCocoa中進行多播4

let foo = SignalProducer<AnyObject?, NSError>(value: nil) 
let someProperty1 = MutableProperty<String>("") 
let someProperty2 = MutableProperty<String>("") 

someProperty1 <~ foo 
    .flatMapError { _ in 
     SignalProducer<AnyObject?, NoError>.empty 
    } 
    .map { _ in 
     return "test" 
    } 

// someProperty2 <~ foo etc... 

爲了避免我的函數(例如,一些網絡的東西)被多次運行,我需要使用多播。據我所知,從CHANGELOGstartWithSignal是用於此的運營商。然而,我似乎無法弄清楚如何以聲明的方式做到這一點。

所以,一種方法可以使在startWithSignal關閉的結合:

foo.startWithSignal { signal, disposable in 
    someProperty1 <~ signal 
     .map { _ in 
      return "test" 
     } 

    // someProperty2 <~ signal etc... 
} 

然而,這顯然會失敗,因爲我們需要擺脫NSError部分。因爲我們提供了Signal(與SignalProducer相反),所以我們不能使用flatMapError(在RAC4中爲RAC4,catch)。我不明白mapError可以爲我們做這個嗎?最後,我甚至不確定這是在RAC3/RAC4中處理多播的正確方法嗎?

任何幫助,非常感謝。

回答

0

使用flatMapError(以及任何其他運營商必須採取SignalProducer參數)如果fooIgnoreError開始只有一次前starWithSignal

let fooIgnoreError = foo 
    .flatMapError { _ in 
     SignalProducer<AnyObject?, NoError>.empty 
    } 


fooIgnoreError.startWithSignal { signal, disposable in 
    someProperty1 <~ signal.map { _ in "test" } 
    someProperty2 <~ signal.map { _ in "test2" } 
} 

,你的潛在信號產生foo是保證一次過啓動。

0

我解釋瞭如何實現多播與示例here

至於錯誤,你可以讓你的財產AnyProperty<Result<Value, Error>>能夠轉發錯誤。如果您希望信號在發生故障時終止,您可以簡單地

signal.flatMapError { error in 
    fatalError("Error: \(error)") // or some other form of error handling, or simply ignoring the error? 
    return .empty 
} 
+0

這看起來正是我所尋找的。但是,我不確定如何組播並能夠轉發錯誤。你能詳細解釋一下嗎? –

+0

我在這裏解釋了一點:http://stackoverflow.com/a/34010499/401024。 – NachoSoto

+0

對不起,我不太清楚,但我希望類型保持爲'SignalProducer '。來自這個答案的例子將其映射到「NoError」中,鏈接中的描述將包含「Next」值中的任何錯誤。是否有可能實現我想要的? –