将委托回调转换为SignalProducer事件?

时间:2016-05-05 13:27:53

标签: ios swift reactive-cocoa-4

我有一个委托对象。有6个委托回调通知代表事情的状态。我有一个代表这些状态的MySpecialEvent swift枚举。 在我实例化这个委托对象时,你能帮我弄清楚如何正确初始化SignalProducer<MySpecialEvent, NoError>并将委托调用挂钩到Producer next事件吗?

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我尝试使用功能反应式编程通常会尽可能地删除代理的使用。你是对的,将MutableProperty添加到委托类似乎更有意义。 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方式

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的一个原因就是能够取代这种繁琐的模式。

您还可以在模态视图控制器中定义

,使用真Signal而不是SignalProducer
let (completionSignal, completionObserver) = Signal<String, NoError>.pipe()

然后在父视图控制器上观察它,而不是开始观察它。