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
实现编写的,但理论保持不变。
我对反应模式有点陌生,现在我有第一个更大的问题。
我已经以反应方式完成了一些异步请求。但是我现在不想做的是"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
实现编写的,但理论保持不变。