等待合并最新,直到调用 #selector



TL;博士;

我需要找到一种方法来设置仅在调用特定self.myMethod()后处理事件的combineLatest而不订阅该方法

描述

我的组件Ainit()中有一个subscribe()路由,其中设置了所有 Rx 订阅。

import RxSwift
final class A {
let bag = DisposeBag()
init() {
//...
subscribe()
}
//...
private func subscribe() {
// Setup all Rx subscriptions here
}

还有另外两个依赖关系BC,每个依赖关系都有其状态,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()然后立即从BstatusCstatus接收最新事件的方式进行设置。

目前我在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()

最新更新