我有一个委托对象。有6个委托回调通知代表事情的状态。我有一个代表这些状态的MySpecialEvent
swift枚举。
在我实例化这个委托对象时,你能帮我弄清楚如何正确初始化SignalProducer<MySpecialEvent, NoError>
并将委托调用挂钩到Producer next
事件吗?
我的期望是(如果这是错误的,请更正),信号生成器将是委托对象的公共producer
属性。然后我可以获得对这个生成器的引用,传递它并基本上以反应方式处理其他事件。
最初我虽然我可以在委托对象上有一个MutableProperty,但我会在每个委托调用中改变它的值,这给了我一个免费的制作人,然后我可以观察到。
更新:我试过这个,它确实有效。
但从概念上讲,我不喜欢这样,因为我所说的是事件,而不是持久的状态值。它确实是一个实现细节,但仍然如此。这种做法是对的吗?
答案 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()
然后在父视图控制器上观察它,而不是开始观察它。