TL;博士;
我需要找到一种方法来设置仅在调用特定self.myMethod()
后处理事件的combineLatest
而不订阅该方法。
描述
我的组件A
在init()
中有一个subscribe()
路由,其中设置了所有 Rx 订阅。
import RxSwift
final class A {
let bag = DisposeBag()
init() {
//...
subscribe()
}
//...
private func subscribe() {
// Setup all Rx subscriptions here
}
还有另外两个依赖关系B
和C
,每个依赖关系都有其状态,A
需要combineLatest
并在该组合上生成一些UI事件。
Observable.combineLatest(b.status,
c.status)
.filter { $0.0 == .connecting && $0.1 == .notReachable }
.map { _ -> Error in
return AError.noInternet
}
.debounce(RxTimeInterval.seconds(5), scheduler: MainScheduler.instance)
.subscribe(onNext: { [weak self] error in
self?.didFail(with: error)
})
.disposed(by: bag)
A
不是UI组件,基本上处理业务逻辑,因此它应该等到UI"说"它准备好处理该业务逻辑。 例如,在 UI 层调用myMethod()
之后A
。
问题
我确实希望subscribe()
中的Observable.combineLatest
以一种等到调用myMethod()
然后立即从B
的status
和C
的status
接收最新事件的方式进行设置。
目前我在A
中这样做:
public func myMethod()
// ...
Observable.combineLatest(...
}
,这打破了我正在努力的干净代码。
您可以做的一件事是使发布者可连接,并在需要时调用.connect()
:
let publisher: Publishers.MakeConnectable<AnyPublisher<YourOutput, YourError>>
func subscribe() {
publisher = Observable.combineLatest(b.status, c.status)
.filter { ... }
.map { ... }
.eraseToAnyPublisher()
.makeConnectable()
publisher.subscribe(...)
}
然后,在myMethod()
中,您可以执行以下操作:
func myMethod() {
publisher.connect()
}
另一种选择是将 PublishSubject 添加到您的A
类中。
final class A {
let myMethodCalled = PublishSubject<Void>()
init() {
myMethodCalled
.withLatestFrom(Observable.combineLatest(a.status, b.status))
// etc...
}
func myMethod() {
myMethodCalled.onNext(())
}
}
例如,如果在 a.status 和 b.status 发出任何值之前调用myMethod()
,则上述情况可能是个问题。
最好的解决方案是传入一个触发整个事情的可观察量,而不是调用myMethod()
。拥抱 Rx 范式并摆脱被动(而不是被动(myMethod()
。