2016-10-27 18 views
1

私はリアクティブパターンに新しいことがありましたが、今は私の最初の大きな質問があります。RXSwiftイベントリスナー

私は反応的な方法でいくつかの非同期要求を行っています。しかし、私が今やりたいことは "イベントリスナー"です。

私はSessionEventListenerプロトコルを持っている瞬間、Sessionオブジェクトを持っています。セッションにはリスナーのリストがあり、成功したログインとログアウトについてすべてのメンバーに通知します。このリスナーは、購読および購読解除を行うことができます。今私は反応的なものを作りたいと思っています。

どうすればよいですか?それはログアウトした場合

public let loginEventBehaviourSubject = BehaviorSubject(value: true) 

は今、私はセッションがログインしている場合はtrue、およびfalseをonNext送ることができます:


私の考えはBehaviourSubjectを定義することです

loginEventBehaviourSubject.onNext(true) // on login 
loginEventBehaviourSubject.onNext(false) // on logout 

そして、私の "リスナー"がそれに加入することができます。

しかし、私はすべてのイベントのための科目を持ってprefereなります

public let loginEventBehaviourSubject = BehaviorSubject(value:) 
public let logoutEventBehaviourSubject = BehaviorSubject(value:) 

をしかし、私はwouldn'tブール値を必要としています。実際にデータを提出することなく「イベント」を発生させるだけの「空の」Subjectを作成できますか?

最後に、質問: Subjectを初期化子に追加する必要があるのはなぜですか。なぜ私はそれを作成できません:BehaviourSubject<Bool>()

答えて

1

これはAPIのため、動作の対象に初期値を与える必要があります。実際にはTを返すBehaviorSubject<T>.value()メソッドが定義されています。そして適切な初期値なしでvalueと呼ぶのは意味がありません。提示されたケースでは、私はPublishSubjectが手近な課題をよりよく表現していると思います。あなたはをreactxのウェブサイトで見つけることができます。

あなたは被験者の.next場合にのみ関心がある場合は、let loginSubject = PublishSubject<Void>()を行うことができます(行動の件名を使用して、あなたはBehaviorSubject<Void>(value:())を書かれている可能性)とloginSubject.onNext()を呼び出すことができるようになります。


ただし、任意の件名を使用することはしばしばアンチパターンです。実際、被験者は命令主義者から反応主義者の世界に橋渡しすることを目的としており、多くの場合、他のオブザーバブルの組み合わせとしてloginEventObservableのようなものを作成することができます。これに関する詳細については、To Use Subject Or Not To Use Subject?を読むことをお勧めします。これはRxの.Net実装を使用して書かれていますが、理論は同じままです。