RxSwift-如何按顺序链接可观察对象

五条

假设我有整数数组:

var items = [1, 2, 3, 4, 5]

然后一个带有Int参数并以此为基础的函数发送网络请求:

 func sendRequest(argument: Int) -> Observable<Void> {
    // sends network request
    ...
 }

我想为items数组的每个元素发送网络请求,但是我想按顺序执行,仅在前一个请求完成后才发送下一个请求。

我的第一次尝试是这样的:

let observables = items.map{ [weak self] argument in (self?.sendRequest(argument: argument) ?? Observable.empty()) }

let result = Observable.concat(observables)

但是,该方法同时发送请求,并且仅顺序地组合结果。

我的第二种方法:

let items = [1, 2, 3, 4, 5]

var result = Observable.just(Void())

for item in items {
    result = result.flatMap{ [weak self] in  
        self?.sendRequest(argument: item) ?? Observable.empty() 
    }
}

看来可行,但显然只有所有网络请求完成后,结果才会发出下一个元素。

我需要的是按顺序发送请求,并在每个单个请求完成后发出可观察到的结果。

有什么建议么?

马克西姆·沃尔金

运营商.concatMap()保证订单保持不变,而不是.flatMap()

Observable.from([1,2,3,4,5]).concatMap( /* your request code */ )

更新

let source = Observable.from([1,2,3,4,5])
let trigger = BehaviorSubject<Int>(value: 0)
let feed = Observable.zip(source, trigger) { return $0.0 }

feed.concatMap {
    /* your request code */
    trigger.onNext(0) // possibly in .onComplete of the service call
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章