一般的に関数型リアクティブ プログラミングでやろうとしていることは、デリゲートの使用を可能な限り取り除くことです。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のやり方
デリゲート パターンを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 で最も気に入っている点の 1 つは、この面倒なパターンを置き換える機能です。
次のようにモーダルView Controllerで定義することによりSignal
、 a ではなくtrue を使用することもできますSignalProducer
let (completionSignal, completionObserver) = Signal<String, NoError>.pipe()
そして、それを開始して観察するのではなく、親View Controllerで観察するだけです。