等待 combineLatest 直到 #selector 被调用。

问题描述 投票:0回答:1

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
    }

还有另外两个依赖关系 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 "说 "它已经准备好处理该业务逻辑时再处理。例如,在 myMethod() 被要求 A 由UI层。

问题

我确实想拥有 Observable.combineLatestsubscribe() 的方式进行设置,直到 myMethod() 被调用,然后立即从 B's statusC's status.

目前我是这样做的 A:

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

,这打破了我所追求的简洁代码。

swift rx-swift
1个回答
2
投票

你可以做的一件事是让发布者可连接,然后调用 .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()
}

1
投票

另一个选择是添加一个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().

© www.soinside.com 2019 - 2024. All rights reserved.