2

我有一个委托对象。有 6 个委托回调通知委托有关事物的状态。我有一个MySpecialEvent代表这些状态的快速枚举。当我实例化这个委托对象时,你能帮我弄清楚如何正确初始化 aSignalProducer<MySpecialEvent, NoError>并将委托调用挂钩到生产者事件吗?next

我的期望是(如果这是错误的,请纠正我)信号生成器将是producer委托对象的公共属性。然后我可以得到这个生产者的引用,传递它并基本上以反应方式处理其他地方的事件。

最初我虽然可以在委托对象上有一个 MutableProperty,但我会在每个委托调用中更改它的值,这给了我一个免费的生产者,然后我可以观察它。

更新:我试过这个,它确实有效。

但从概念上讲,我不喜欢这样,因为我说的是事件,而不是持久状态值。确实,这是一个实现细节,但仍然如此。这种做法对吗?

4

1 回答 1

1

一般来说,我对函数响应式编程所做的尝试是尽可能地删除委托的使用。MutableProperty您是对的,将 a 添加到委托类似乎更有状态。MutableProperties 是无状态和有状态范式之间的桥梁。

那么这是什么意思?

当事情发生变化时,而不是创建一个委托来处理事件。找到一种方法来观察事件作为信号并对事件做出反应。一个例子可能是最容易理解的。

假设您有一个正在呈现的模态视图,并且呈现控制器是呈现视图控制器的委托。您将呈现控制器传递给模态...

func showModal() {
  let modalVC = ModalViewController()
  modalVC.delegate = self
  self.presentModalViewController(modalVC, animated: true)
}

func modalComplete() {
  self.dismissViewControllerAnimated(true, completion: nil)
  print("All Done with Modal.")
}

然后,在某个时候呈现的控制器(显然没有显示所有委托协议的内容)

func allDone() {
  self.delegate?.modalComplete()
}

玻璃钢方式

用FRP替换委托模式会导致类似...

func showModal() {
  let modalVC = ModalViewController()
  modalVC.completionSignal
    .startWithNext { [weak self] _ in
      self.modalComplete()
    }
  self.presentModalViewController(modalVC, animated: true)
}

func modalComplete() {
  self.dismissViewControllerAnimated(true, completion: nil)
  print("All Done with the FRP Modal.")
}

在您的模态中,您将创建一个信号,您可以在该关闭模态时发送一些东西。

let (completionSignal, completionObserver) = SignalProducer<String, NoError>.buffer(1)

func allDone() {
  completionObserver.sendNext("Whatever you want")
  completionObserver.sendComplete()
}

希望这可以帮助。与代表和 FRP 一起工作可能会让人感到困惑,而我最喜欢 RAC4 的一件事是它能够取代这种繁琐的模式。

您还可以通过在模态视图控制器中定义来使用 trueSignal而不是 aSignalProducer

let (completionSignal, completionObserver) = Signal<String, NoError>.pipe()

然后只是在父视图控制器上观察它,而不是启动和观察它。

于 2016-07-25T15:00:13.170 回答