将委托回调转换为SignalProducer事件



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

我的期望是(如果这是错误的,请纠正我)信号生成器将是委托对象的公共producer属性。然后,我可以获得这个制作人的参考,并将其传递给其他人,基本上以被动的方式处理其他地方的事件。

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

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

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

我通常尝试使用函数式反应式编程来做的是尽可能多地删除委托的使用。您是对的,向委托类添加MutableProperty似乎更有状态。可变属性是无状态和有状态范例之间的一座桥梁。

那么,这意味着什么

而不是创建一个委托,用于在情况发生变化时处理事件。找到将事件视为信号并对事件作出反应的方法。举个例子可能最容易理解。

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

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()

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

最新更新