【问题标题】:RxSwift - how to chain observables sequentiallyRxSwift - 如何按顺序链接可观察对象
【发布时间】:2018-06-03 00:19:21
【问题描述】:

假设我有 Ints 数组:

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

它似乎有效,但显然只有在所有网络请求完成后,结果才会发出下一个元素。

我需要的是顺序发送请求,结果可观察,一旦每个请求完成,就会发出下一个事件。

有什么建议吗?

【问题讨论】:

    标签: ios iphone swift observable rx-swift


    【解决方案1】:

    运营商.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
    }
    

    【讨论】:

    • 问题是所有请求仍然是一次发送,我的目标是一个一个发送
    • @MaximVolgin 在你的第一个例子中` Observable.from([1,2,3,4,5]).concatMap{ return $0}.subscribe(onNext:{` 我收到了这个错误Instance method 'concatMap' requires that 'Int' conform to 'ObservableConvertibleType' 有什么想法吗?
    猜你喜欢
    • 2018-06-07
    • 2018-01-10
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2020-01-13
    • 2015-01-12
    相关资源
    最近更新 更多