gpt4 book ai didi

ios - RxSwift - 如何按顺序链接可观察量

转载 作者:行者123 更新时间:2023-12-03 19:48:50 25 4
gpt4 key购买 nike

假设我有 Int 数组:

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
}

关于ios - RxSwift - 如何按顺序链接可观察量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47906030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com