具有参数

时间:2017-08-15 21:06:11

标签: ios swift reactive-programming rx-swift

我对RxSwift相当新,所以我有以下问题,假设我有3个Observable示例函数,它们返回不同的可观察类型:

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()
    }
}

如何依次执行这3个函数,并在func2上使用func1的返回值,然后在func2完成后运行func3。

我希望我能够明确地提出这个问题,但是我再次对RxSwift很陌生,我不知道这些操作是否可行。

1 个答案:

答案 0 :(得分:1)

这是一个例子......

假设你有三个功能:

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

然后你可以:

let a = func1()
let b = a.flatMap { func2($0) }
let c = b.flatMap { func3($0) }

或:

let c = func1()
    .flatMap { func2($0) }
    .flatMap { func3($0) }

那就是说,你的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,然后是completederror。这样做更好,因为你可以在它之后映射或flatMap,一旦它完成就会发生。