2

デリゲートであるオブジェクトがあります。デリゲートに状態を通知する 6 つのデリゲート コールバックがあります。これらの状態をMySpecialEvent表す迅速な列挙型があります。SignalProducer<MySpecialEvent, NoError>このデリゲート オブジェクトをインスタンス化するときに、デリゲート呼び出しをプロデューサーnextイベントに正しく初期化し、フックする方法を理解するのを手伝ってもらえますか?

私の期待は (これが間違っている場合は訂正してください)、シグナル プロデューサーがproducerデリゲート オブジェクトのパブリック プロパティになることです。次に、このプロデューサーへの参照を取得して渡し、基本的にはリアクティブな方法で別の場所でイベントを処理します。

最初は、デリゲート オブジェクトに MutableProperty を設定できると思っていましたが、各デリゲート呼び出し内でその値を変更すると、無料でプロデューサーが得られ、それを観察できます。

更新:これを試してみましたが、実際に機能します。

しかし、私が話しているのはイベントであり、永続的な状態値ではないため、概念的にはこれは好きではありません。それは実装の詳細ですが、それでもなおです。そのアプローチは正しいですか?

4

1 に答える 1

1

一般的に関数型リアクティブ プログラミングでやろうとしていることは、デリゲートの使用を可能な限り取り除くことです。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で観察するだけです。

于 2016-07-25T15:00:13.170 に答える