[英]Multicasting of cold signals in RAC3/4
我想要兩個冷的SignalProducer
的B和C,它們都依賴於另一個冷的SignalProducer
A,后者發出db實體對象-因此,對我來說組播非常重要,因此完全相同的對象同時到達B和C。 :
--(transformations)--B
/
-A ----(transformations)--C
但是由於B和C進行了某些轉換,可能需要大量工作,所以我不希望它們在連接之前發生。
在RAC2中,在這種情況下, [[RACSignal
-publish]
-autoconnect
]
可以正常工作。
就像CHANGELOG所說的那樣,使用startWithSignal
從RAC2進行的多播更加startWithSignal
,但它1)立即開始,2)促使我在整個鏈的其余部分使用熱信號
SignalProducer.buffer
似乎是可以接受的解決方案。
在這種情況下正確的解決方案是什么?
目前,我在RAC3 / Swift1.2中從RAC2重新實現了-publish
-autoconnect
,如下所示:
func buffer<T, E>(capacity: Int) -> SignalProducer<T, E> -> SignalProducer<T, E> {
return { (signal: SignalProducer<T, E>) -> SignalProducer<T, E> in
let (buffer, bufferSink) = SignalProducer<T, E>.buffer(capacity)
var connectionsCount = 0
var upperDisposable: Disposable? = nil
let addSubscriber: ()->() = {
if (connectionsCount == 0) {
upperDisposable = signal.start(bufferSink)
}
connectionsCount++
}
let removeSubscriber: ()->() = {
connectionsCount--
if connectionsCount == 0 {
upperDisposable?.dispose()
upperDisposable = nil
}
}
return SignalProducer { (sink, disposable) in
disposable.addDisposable(removeSubscriber)
sendNext(sink, buffer)
addSubscriber()
}
|> flatten(.Concat)
}
}
它不是線程安全的,可能包含其他問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.