代码之家  ›  专栏  ›  技术社区  ›  Yevhen Dubinin rednuht

等待CombineTest,直到调用#选择器

  •  0
  • Yevhen Dubinin rednuht  · 技术社区  · 5 年前

    TL;博士

    我需要找到一种安装方法 combineLatest 仅在特定事件之后处理事件的 self.myMethod() 被称为 不使用那种方法订阅 .

    描述

    我的组件 A 有一个 subscribe() 罗廷 init() ,其中设置了所有接收订阅。

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

    还有另外两个依赖项 B C ,每个人都有自己的状态 A. 需要 联合测试 并在组合后生成一些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. 按用户界面层。

    问题

    我真的很想 Observable.combineLatest 在里面 订阅 以等待的方式设置 myMethod() 被调用,然后立即从 B 是的 status C 是的 地位 .

    目前我是这样做的 A. :

    public func myMethod()
        // ... 
        Observable.combineLatest(...
    }
    

    ,这打破了我正在努力做到的干净准则。

    0 回复  |  直到 4 年前
        1
  •  2
  •   New Dev    5 年前

    你可以做的一件事是让出版商可以连接,然后打电话给 .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()
    }
    
        2
  •  1
  •   Daniel T.    5 年前

    另一个选择是在你的博客中添加一个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发出任何值之前调用。

    这个 最好的 解决方案是传入一个触发整个事件的可观察对象,而不是调用 myMethod() .接受Rx范式,摆脱被动(而非被动) myMethod() .