一般来说,我对函数响应式编程所做的尝试是尽可能地删除委托的使用。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()
然后只是在父视图控制器上观察它,而不是启动和观察它。