swift 跳过源序列中的事件,直到任务完成

uwopmtnx  于 2023-03-07  发布在  Swift
关注(0)|答案(1)|浏览(112)

我有一个PublishSubject作为源序列。我需要在接收事件时执行API调用。想象一下,如果这是发射事件太快,我想跳过所有事件,直到api调用完成。在API调用完成后,继续接收事件等等。
我不想使用去抖或油门,因为有其他操作与此主要序列,所以我不想延迟所有其他操作。
我尝试用skipUntil()操作符实现一个解决方案,如下所示。

import UIKit
import RxSwift
import RxSwiftPlayground

let disposeBag = DisposeBag()

let subject = PublishSubject<String>()
let trigger = PublishSubject<String>()

subject
    .skipUntil(trigger)
    .subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)

subject.onNext("A")

trigger.onNext("T1")

subject.onNext("B")
subject.onNext("C")

trigger.onNext("T2")

subject.onNext("D")

然而,它似乎只对第一个触发器有效。来自触发器主题的后续事件在这里没有影响。
非常感谢有人能分享是否有任何其他运营商为此目的或已实施类似的解决方案与RxSwift。

nnsrf1az

nnsrf1az1#

您可能会发现我关于flatMap的文章很有用:RxSwift’s Many Faces of FlatMap
我这样说是因为您已经精确地描述了flatMapFirst的功能。
有时候,...你宁愿忽略来自源的事件,直到子观测完成。这就是flatMapFirst的作用。...它一次只允许一个子观测...它忽略来自源的事件,直到子观测完成。

subject
    .flatMapFirst { _ in apiCall() }
    .subscribe(onNext: { apiCallResult in 
        print(apiCallResult)
    })
    .disposed(by: disposeBag)

相关问题