【问题标题】:Multicasting of cold signals in RAC3/4RAC3/4 中冷信号的组播
【发布时间】:2016-03-19 15:05:35
【问题描述】:

我想要两个冷的SignalProducers B 和 C,它们都依赖于另一个冷的 SignalProducer A,它发出 db 实体对象——所以对我来说多播非常重要,所以完全相同的对象到达两个 B和 C。这是一些图表:

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

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

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

正如CHANGELOG 所说,来自 RAC2 的多播使用startWithSignal 变得更干净,但它 1) 立即开始,2) 促使我在整个链的其余部分使用热信号

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

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

【问题讨论】:

    标签: reactive-cocoa reactive-cocoa-3


    【解决方案1】:

    目前我在 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)
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 2012-06-16
      • 1970-01-01
      相关资源
      最近更新 更多