带参数的链式序列可观察对象

Chain sequence observables with arguments

我是 RxSwift 的新手,所以我遇到了以下问题,假设我有 3 个 Observable 示例函数,它们 return 不同的可观察类型:

func observableFunc1(item1: DummyObject) -> Observable<AVURLAsset> {
    return Observable.create { observer in

        let something_with_AVURLAsset = AVURLAsset(url: URL(fileURLWithPath: "file"))

        observer.onNext(something_with_AVURLAsset)

        observer.onCompleted()

        return Disposables.create()
    }
}

func observableFunc2(item: AVURLAsset) -> Observable<Data> {
    return Observable.create { observer in

        let something_with_data = Data()

        observer.onNext(something_with_data)

        observer.onCompleted()

        return Disposables.create()
    }
}

func observableFunc3(_ params: [String:Any]) -> Observable<Any> {
    let disposeBag = DisposeBag()
    return Observable.create { observer in
        RxAlamofire.request(api.sendData(params)).debug().subscribe(
            onNext: { reponse in
                observer.onCompleted()
        },
            onError: { error in
                observer.onError(customError.theError("error"))
        }
            )
            .addDisposableTo(disposeBag)
        return Disposables.create()
    }
}

如何使用要在 func2 上使用的 func1 的 return 值顺序执行这 3 个函数,然后当 func2 最终完成时 运行 func3.

我希望我把问题说得够清楚了,但话又说回来,我真的是 RxSwift 的新手,我不知道这些操作是否可行。

这是一个例子...

假设你有以下三个功能:

func func1() -> Observable<Data1>
func func2(_ data: Data1) -> Observable<Data2>
func func3(_ data: Data2) -> Observable<Data3>

那么您可以:

let a = func1()
let b = a.flatMap { func2([=11=]) }
let c = b.flatMap { func3([=11=]) }

或:

let c = func1()
    .flatMap { func2([=12=]) }
    .flatMap { func3([=12=]) }

就是说,您的 observableFunc3 很破烂。您需要从中取出处理袋。按照目前的情况,网络调用将在开始前取消。

如果您真的不希望它发出任何值,那么:

func observableFunc3(_ params: [String:Any]) -> Observable<Void> {
    return RxAlamofire.request(api.sendData(params))
        .filter { false }
}

以上将发出 completederror 但没有 next 值。

最好这样写:

func observableFunc3(_ params: [String:Any]) -> Observable<Void> {
    RxAlamofire.request(api.sendData(params))
        .map { _ in }
}

以上将发出一个 next,然后是一个 completed 或一个 error。这样更好,因为您可以在它之后进行映射或平面映射,以便在完成后让事情发生。