0

我想要两个冷SignalProducer的 B 和 C,它们都依赖于其他冷SignalProducerA,它发出 db 实体对象 - 所以对我来说,多播以便完全相同的对象到达 B 和 C 是至关重要的。这是一些图表:

     --(transformations)--B
    /
-A ----(transformations)--C

但是因为 B 和 C 有一些转换,这可能需要大量的工作,所以我不希望它们在连接之前发生。

在 RAC2 中,我们在这种情况下工作正常。[[RACSignal-publish]-autoconnect]

正如CHANGELOG所说,来自 RAC2 的多播startWithSignal使用 .

SignalProducer.buffer似乎是一个可以接受的解决方案。

在这种情况下,正确的解决方案是什么?

4

1 回答 1

0

目前我-publish -autoconnect在 RAC3/Swift1.2 中从 RAC2 重新实现,如下所示:

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)
    }
}

它不是线程安全的,可能包含其他问题

于 2015-12-15T03:17:36.460 回答