RxSwift-如何按顺序链接可观察对象 [英] RxSwift - how to chain observables sequentially

查看:419
本文介绍了RxSwift-如何按顺序链接可观察对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个整数数组:

Assume I have array of Ints:

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

和一个接受Int参数并以此为基础的函数发送网络请求:

and a function that takes Int argument and basing on it sends network request:

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

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

I want to send network requests for each element of items array, but I want to do it sequentially, send next request only once previous one is finished.

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

My first attempt was something like this:

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

let result = Observable.concat(observables)

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

This approach however sends request simultaneously and only combine the results sequentially.

第二种方法:

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

这似乎可行,但是很明显,只有在所有网络请求完成后,结果才会发出下一个元素.

It seems to work, but obviously result emits next element only once all network requests finish.

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

What I would need is sending requests sequentially with result observable that emits next event once each single request is finished.

有什么建议吗?

推荐答案

操作员.concatMap()保证顺序保持不变,而不是.flatMap()

Operator .concatMap() guarantees that order remains intact, as opposed to .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
}

这篇关于RxSwift-如何按顺序链接可观察对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆