2016-05-05 5 views
2

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

シグナルプロデューサがデリゲートオブジェクトのパブリックproducerプロパティになることを期待しています。それから私はこのプロデューサーへの参照を取得し、それを渡し、基本的に反応的な方法でイベントを処理します。

私はデリゲートオブジェクトにMutablePropertyを持たせることができましたが、私は各デリゲートコールの中で値を変更します。これは私が見ることができる無料のプロデューサーです。

更新:これを試してみると実際に動作します。

しかし概念的には、私が話しているのはイベントであり、永続的な状態値ではないからです。それは実装の詳細ですが、それでもなお本当です。そのアプローチは正しいのでしょうか?

答えて

0

機能的な反応型プログラミングでは、できるだけ多くの代理人の使用を取り除いています。デリゲートクラスにMutablePropertyを追加すると少しステートフルなようです。 MutablePropertiesは、ステートレスパラダイムとステートフルパラダイムの間のブリッジの一種です。

これはどういう意味ですか?

物事が変わったときにイベントを処理するために使用する代理人を作成する代わりに。イベントを信号として観察し、イベントに反応する方法を見つける。おそらく一例が分かりやすいでしょう。

はあなたが提示されているモーダルビューを持っていると言う、と 提示コントローラは、 提示ビューコントローラのデリゲートです。あなたは、その後...モーダルにいくつかの点で提示コントローラ(もちろん、すべてのデリゲートプロトコルのものを示していない)

func allDone() { 
    self.delegate?.modalComplete() 
} 

FRPの道

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.") 
} 

を提示するコントローラを渡します

代理人パターンを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つは、この面倒なパターンを置き換える能力です。

また

let (completionSignal, completionObserver) = Signal<String, NoError>.pipe() 

などのモーダルビューコントローラに定義し、そしてちょうど親ビューコントローラ上でそれを観察するのではなく起動し、それを観察することによって、真のSignalではなくSignalProducerを使用することができます。

関連する問題