如何等待可变数组中的所有observable在RxSwift中完成

时间:2017-07-28 12:53:37

标签: ios swift rx-swift

我的期望是即时添加可观察对象(例如:图像上传),让它们开始,当我动态排队所有内容时,等待所有可观察对象完成。

这是我的班级:

open class InstantObservables<T> {
    lazy var disposeBag = DisposeBag()

    public init() { }

    lazy var observables: [Observable<T>] = []
    lazy var disposables: [Disposable] = []

    open func enqueue(observable: Observable<T>) {
        observables.append(observable)

        let disposable = observable
            .subscribe()

        disposables.append(disposable)

        disposable
            .addDisposableTo(disposeBag)
    }

    open func removeAndStop(atIndex index: Int) {
        guard observables.indices.contains(index)
            && disposables.indices.contains(index) else {
            return
        }
        let disposable = disposables.remove(at: index)
        disposable.dispose()

        _ = observables.remove(at: index)
    }

    open func waitForAllObservablesToBeFinished() -> Observable<[T]> {
        let multipleObservable = Observable.zip(observables)
        observables.removeAll()
        disposables.removeAll()
        return multipleObservable
    }

    open func cancelObservables() {
        disposeBag = DisposeBag()
    }
}

但是当我订阅waitForAllObservablesToBeFinished()发送的observable时,所有这些都被重新执行(这是逻辑,关于Rx如何工作)。

无论订阅数量是多少,我如何保证每次执行一次?

1 个答案:

答案 0 :(得分:0)

在写这个问题时,我得到了答案! 通过shareReplay(1)改变观察,并排队和订阅这个改变的观察......它的工作原理!

以下是更新后的代码:

open class InstantObservables<T> {
    lazy var disposeBag = DisposeBag()

    public init() { }

    lazy var observables: [Observable<T>] = []
    lazy var disposables: [Disposable] = []

    open func enqueue(observable: Observable<T>) {
        let shared = observable.shareReplay(1)
        observables.append(shared)

        let disposable = shared
            .subscribe()

        disposables.append(disposable)

        disposable
            .addDisposableTo(disposeBag)
    }

    open func removeAndStop(atIndex index: Int) {
        guard observables.indices.contains(index)
            && disposables.indices.contains(index) else {
            return
        }
        let disposable = disposables.remove(at: index)
        disposable.dispose()

        _ = observables.remove(at: index)
    }

    open func waitForAllObservablesToBeFinished() -> Observable<[T]> {
        let multipleObservable = Observable.zip(observables)
        observables.removeAll()
        disposables.removeAll()
        return multipleObservable
    }

    open func cancelObservables() {
        disposeBag = DisposeBag()
    }
}