我对反应模式有点新意,现在我有了第一个更大的问题。
我以反应方式完成了一些异步请求。但我现在不想做的是“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>()
?
答案 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
实现编写的,但理论保持不变。