如何按顺序链接 RxSwift Singles

How to chain RxSwift Singles in order

假设我想要 运行 3 种方法,入口点取决于整数(数字)。

func method1() -> Single<Void> {
    return .just(())
}

func method2() -> Single<Void> {
    return .just(())
}

func method3() -> Single<Void> {
    return .just(())
}

在常规 Swift 中会有这样的切换:

func doThings(startingFrom number: Int) -> Single<Void> {
    switch number {
    case 0:
        method1()
        fallthrough
    case 1:
        method2()
        fallthrough
    case 2:
        method3()
        fallthrough
    default:
        print("Finished")
    }

    return .just(())
}

但考虑到 method1()、method2() 和 method3 是单一的,我认为 RxSwift 中应该有一种方法可以将它们链接起来而不会弄乱它们的执行顺序。

我是这样想的,但它是同步工作的,因此无法保证方法的执行顺序。

public func doThings(startingFrom number: Int) -> Single<Void> {
    var actions: [Single<Void>] = []
    switch number {
    case 0:
        actions.append(method1())
        fallthrough
    case 1:
        actions.append(method2())
        fallthrough
    case 2:
        actions.append(method3())
        fallthrough
    default:
        break
    }

    return Single
        .zip(actions)
        .do(onSuccess: { _ in
            Log.debug("Finished")
        })
        .mapToVoid()
}

对不起,如果我没有理解,我是 Rx 的新手Swift。如有不妥请指正

您的解决方案非常接近。只需使用 concat 而不是 zip 就可以了。

糟糕,Single 缺少 concat 运算符,因此您必须先转换为 Observable 或 Completable。这里有几个选项:

func doThings(startingFrom number: Int) -> Single<Void> {
    Observable.concat(
        [method1(), method2(), method3()]
            .dropFirst(number)
            .map { [=10=].asObservable() }
    )
    .toArray()
    .map(to: ())
    .do(onSuccess: { _ in
        print("Finished")
    })
}

func doThingsʹ(startingFrom number: Int) -> Single<Void> {
    Completable.concat(
        [method1(), method2(), method3()]
            .dropFirst(number)
            .map { [=10=].asCompletable() }
    )
    .andThen(.just(()))
    .do(onSuccess: { _ in
        print("Finished")
    })
}