RXSwift 事件监听器

RXSwift eventlistener

我对反应模式有点陌生,现在我有第一个更大的问题。

我已经以反应方式完成了一些异步请求。但是我现在不想做的是"Eventlistener"。

我有一个 Session 对象,目前我有一个 SessionEventListener 协议。 Session 有一个监听器列表,并通知所有监听器成功登录和注销。此听众可以订阅和取消订阅。这个东西我现在想创造反应。

你会怎么做?


我的想法是定义一个 BehaviourSubject:

public let loginEventBehaviourSubject = BehaviorSubject(value: true)

现在我可以发送 onNext 如果会话已登录则为真,如果已注销则为假:

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

我的"listeners"可以订阅。

但我希望每个活动都有主题:

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

但那样我就不需要布尔值了。我可以制作一种 "empty" 主题,只触发 "events" 而没有提交真正的数据吗?

然后是我的最后一个问题: 为什么我必须在 Subject 的初始化器中添加一个实例。为什么我不能像这样创建它:BehaviourSubject<Bool>()?

你需要给行为主体一个初始值,因为它是API。的确,它定义了BehaviorSubject<T>.value()方法,其中returns一个T。如果没有适当的初始值,调用 value 是没有意义的。在目前的案例中,我认为 PublishSubject 更能代表手头的任务。您可以在 reactivex 网站上找到 more documentation on the available kinds of subjects

如果你只对你的主题的.next事件感兴趣,你可以做let loginSubject = PublishSubject<Void>()(使用行为主题,你可以写BehaviorSubject<Void>(value: ()))并且能够打电话给 loginSubject.onNext().


请注意,使用任何主题通常是一种反模式。事实上,大多数时候 subject 都是为了从命令式世界到反应式世界架起桥梁,你可以经常创建像 loginEventObservable 这样的东西作为其他可观察量的组合。有关这方面的更多信息,我建议阅读 To Use Subject Or Not To Use Subject?。它是使用 Rx 的 .Net 实现编写的,但理论保持不变。