RAC3中的MutableProperty的多个观察者

时间:2015-08-12 21:04:52

标签: swift reactive-cocoa reactive-cocoa-3

我有一个" DataManager"使用RAC3处理我的应用程序状态的单例类。它包含多个MutableProperty,我在不同的位置开始和观察。

我想让我的DataManager启动或创建一个信号,我可以使用我的DataManager单例在任何视图控制器中观察,使用observe()而不是start()等。但是我被困住了,不是确定如何在我的DataManager中初始化此信号。我尝试过定义像

这样的属性
let documentUpdateSignal: Signal<Int,NSError>

let remainingDocuments = MutableProperty<Int>(0)

然后尝试在init上使用我的mutable属性生产者启动它

之类的东西
override init() {
  documentUpdateSignal = remainingDocuments.producer.start(next: {
    docs in
    println("doc count \(docs)")
  })
  super.init()
}

但这不起作用,因为它没有返回Signal<Int,NSError>

我还试图创建一种方法,在没有太多运气的情况下返回信号,而不是属性...就像这样,即使它看起来不太正确。

func updateSignal() -> Signal<Int, NSError> {
  return remainingDocuments.producer
}

愿意帮忙 非常感谢!

1 个答案:

答案 0 :(得分:0)

你现在可能已经解决了这个问题:

var documentUpdateSignal: Signal<Int, NoError>?

....

remainingDocuments.producer.startWithSignal { 
            (var signal: Signal<Int, NoError>, var disposable : Disposable) -> () in
            self.documentUpdateSignal = signal
        }

我不确定您是否可以在班级内拨打startWithSignal电话。 init()但是,由于self无法被块捕获,直到super的init被调用。鉴于此,我认为documentUpdateSignal是可选的。

请注意,我还将documentUpdateSignal的声明从使用NSError改为NoError以适应MutableProperty的制作人的声明签名。

然后您可以使用以下方式观察来自其他地方的信号:

self.documentUpdateSignal?.observe(next: { 
                (var value: Int) in
                println("Mutable property = \(value)")
            }
        )