TL;DR;
我需要找到一种方法来设置 combineLatest
只在特定的事件发生后才进行处理。self.myMethod()
叫做 而不以这种方式订阅
说明
我的组件 A
拥有 subscribe()
例行 init()
,在这里设置了所有的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 "说 "它已经准备好处理该业务逻辑时再处理。例如,在 myMethod()
被要求 A
由UI层。
问题
我确实想拥有 Observable.combineLatest
在 subscribe()
的方式进行设置,直到 myMethod()
被调用,然后立即从 B
's status
和 C
's 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(())
}
}
上述情况可能会成为一个问题,比如说 myMethod()
在a.status和b.status发出任何值之前被调用。
在a.status和b.status发出任何值之前,调用 最佳 解决办法是传入一个Observable来触发整个事件,而不是调用 myMethod()
. 拥抱Rx范式,摆脱被动(而不是被动)。myMethod()
.