RXSwift eventlistener

时间:2016-10-27 22:34:44

标签: listener rx-swift

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

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

我有Session个对象,目前我有一个SessionEventListener协议。 Session有一个监听器列表,并告知所有监听器有关成功登录和注销的信息。此听众可以订阅和取消订阅。这件事我现在想要反应。

你会怎么做?

我的想法是定义一个BehaviourSubject:

public let loginEventBehaviourSubject = BehaviorSubject(value: true)

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

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

我的“听众”可以订阅它。

但我会优先考虑每个事件的主题:

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

但后来我不需要布尔了。我可以制作一种“空”主题,只会在不提交真实数据的情况下触发“事件”。

然后我的最后一个问题: 为什么我必须向Subject的初始值设定项添加实例。为什么我不能创建它:BehaviourSubject<Bool>()

1 个答案:

答案 0 :(得分:1)

由于它的API,您需要为行为主题提供初始值。实际上,它定义了BehaviorSubject<T>.value()方法,该方法返回T。如果没有适当的初始值,调用value是没有意义的。在本案例中,我认为PublishSubject更能代表手头的任务。您可以在reactx网站上找到more documentation on the available kinds of subjects

如果您只对主题的.next事件感兴趣,可以执行let loginSubject = PublishSubject<Void>()(使用行为主题,您可以写BehaviorSubject<Void>(value: ()))并且可以调用loginSubject.onNext()

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