簡體   English   中英

RAC3 / 4中冷信號的組播

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM