[英]Multicasting in ReactiveCocoa 3 and ReactiveCocoa 4
假設我有一個返回SignalProducer<AnyObject?, NSError>
的函數,並且我想將生產者綁定到多個MutableProperty<String>
。 因此,如下所示:
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...
為了避免我的功能(例如某些網絡設備)被多次運行,我將需要使用多播。 據我從CHANGELOG得知 , startWithSignal
是用於此的運算符。 但是,我似乎無法弄清楚如何以聲明的方式進行此操作。
因此,一種方法可能是在startWithSignal
的關閉過程中進行startWithSignal
:
foo.startWithSignal { signal, disposable in
someProperty1 <~ signal
.map { _ in
return "test"
}
// someProperty2 <~ signal etc...
}
但是,這顯然會失敗,因為我們需要擺脫NSError
部分。 因為我們要提供一個Signal
(與SignalProducer
相對),所以我們不能使用flatMapError
(在RAC4中,在RAC3中catch
)。 而且我看不到mapError
如何為我們做到這一點? 最后,我什至不確定這是否是在RAC3 / RAC4中處理多播的正確方法?
任何幫助深表感謝。
在starWithSignal
之前使用flatMapError
(以及必須使用SignalProducer
參數的任何其他運算符)
let fooIgnoreError = foo
.flatMapError { _ in
SignalProducer<AnyObject?, NoError>.empty
}
fooIgnoreError.startWithSignal { signal, disposable in
someProperty1 <~ signal.map { _ in "test" }
someProperty2 <~ signal.map { _ in "test2" }
}
如果fooIgnoreError
僅啟動一次,則可以保證基礎信號生成器foo
也只能啟動一次。
我在這里通過示例解釋了如何實現多播 。
對於錯誤,可以使屬性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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.