【问题标题】:Chain sequence observables with arguments带参数的链序列可观察对象
【发布时间】:2018-01-23 21:17:52
【问题描述】:

我是 RxSwift 的新手,所以我有以下问题,假设我有 3 个 Observable 示例函数,它们返回不同的 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个函数,将func1的返回值用于func2,然后在func2完成时最终运行func3。

我希望我把问题说得够清楚了,但话说回来,我对 RxSwift 还是很陌生,我不知道这些操作是否可行。

【问题讨论】:

  • func3是否需要func2返回的数据?
  • 如果你能提供一个例子,我会很感激:)

标签: ios swift reactive-programming rx-swift


【解决方案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 以使事情发生。

【讨论】:

  • 您好,感谢您的回答,但是我该如何订阅这些功能呢?
  • c.subscribe(onNext: { data in /* do stuff with data */ }, onError: { error in /* do stuff with error */ }).disposed(by: disposeBag) 会做到的。通常,处置包应该在您的视图或视图控制器中,而不是在函数中。一旦 dispose bag 超出范围,流就会停止流动。
猜你喜欢
  • 1970-01-01
  • 2019-01-30
  • 2018-06-07
  • 2019-09-09
  • 1970-01-01
  • 2015-01-12
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多