【问题标题】:Multiple observers of a MutableProperty in RAC3RAC3 中 MutableProperty 的多个观察者
【发布时间】:2015-11-05 15:54:21
【问题描述】:

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

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

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

let remainingDocuments = MutableProperty<Int>(0)

然后尝试在初始化时使用我的可变属性的生产者启动它 像

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

但这不起作用,因为它不返回Signal&lt;Int,NSError&gt;

我还尝试创建一个方法,该方法返回一个不太幸运的信号,而不是一个属性......即使它看起来不太正确。

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

很想帮忙 非常感谢!

【问题讨论】:

  • 我感觉这就是 startWithSignal 发挥作用的地方,尽管我很难找到如何使用此方法的示例。

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


【解决方案1】:

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

var documentUpdateSignal: Signal<Int, NoError>?

....

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

我不确定你是否能够从你的班级'init() 中调用startWithSignal,因为selfsuper 的初始化之前无法被块捕获叫。鉴于此,我假设documentUpdateSignal 是可选的。

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

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

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

【讨论】:

  • 按预期工作。谢谢!
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2011-06-17
  • 2019-08-22
  • 1970-01-01
  • 2013-03-05
  • 2022-11-17
相关资源
最近更新 更多